继承
构造函数.prototype的成员:
//Function函数所有的参数全都是字符串(初始化)
//Function函数的作用就是将所有的参数组合起来,变成一个函数
arguments对象
在每一个函数调用的过程中, 函数代码体内有一个默认的对象arguments
, 它存储着实际传入的所有参数。
arguments
是一个伪数组对象. 它表示在函数调用的过程中传入的所有参数的集合。在函数调用过程中不规定参数的个数与类型, 可以使得函数调用变得非常灵活性。
JavaScript中的函数并没有规定必须如何传参:
1. 定义函数的时候不写参数, 一样可以调用时传递参数
2. 定义的时候写了参数, 调用的时候可以不传参
3. 定义的时候写了一个参数, 调用的时候可以随意的传递多个而参数
在代码设计中, 如果需要函数带有任意个参数的时候, 一般就不带任何参数, 所有的参数利用arguments
对象来获取. 一般的函数定义语法, 可以写成:
function foo (/* ... */) {
}
## 继承
### 混入式继承
for in
使用for in遍历对象1的属性,将所有的属性添加到另外一个对象2上
这时候就可以称 对象2 继承自 对象1
### 原型继承
*利用对象的动态特性,为原型对象添加成员
*直接替换原型对象
1.替换前的对象,在替换之后,所有的成员都丢失
2.替换原型对象的时候,需要手动去指定原型对象的construtor属性
*利用混入给原型对象添加成员
### 经典继承
```js
var 对象1 = Object.create(对象2);
```
这个时候,创建出来的对象1继承自对象2
Object.create方法存在兼容性问题
如何解决?
1.检测浏览器是否支持Object.create方法,如果不支持,直接手动给Object添加create方法
2.自定义函数,在函数内部判断浏览器是否支持Object.create方法,如果不支持,则手动创建对象返回,否则直接调用
```js
function create(obj){
if(Object.create){
return Object.create(obj);
}else{
function F(){
}
F.prototype = obj;
return new F();
}
}
```
## 原型链
### 什么是原型链
每个构造函数都有原型对象,每个对象都有构造函数,每个构造函数的原型对象都是对象,也就有构造函数
然后就形成一个链式的结构,我们称之为原型链
### 原型继承是什么?
通过修改原型链的结构,实现继承的方式就是原型继承
### 对象和原型的成员关系
```js
function Person(){};
var p = new Person();
```
p对象中包含的成员有:Person.prototype中的成员和自身拥有成员
Person.prototype中的成员有:Object.prototype的成员和自身的成员
p对象可以访问Person.prototype和Object.prototype中的所有成员
## Object.prototype的成员
* constructor :指向和该原型相关的构造函数
* hasOwnProperty 方法: 判断对象本身是否拥有某个属性
* properIsEnumerable 方法: 1.判断属性是否属于对象本身,2.判断属性是否可以被遍历
* toString toLocaleString: 将对象转换成字符串toLocalString转换成字符串的时候应用的本地的设置格式
//3.isPrototypeOf 方法 判断对象1是不是对象2的原型 |
|
//对象1.isPrototypeOf(对象2) |
|
// function Person(){ |
|
// |
|
// } |
|
// |
|
// var p = new Person(); |
|
// var o ={}; |
|
// console.log(o.isPrototypeOf(p)); |
* valueOf 方法:在对象参与运算的时候,首先调用valueOf方法获取对象的值,如果该值无法参与运算,将会调用toString方法
* __proto__ 属性: 指向当前对象的原型对象
## Function
### 3种创建函数的方式
*直接声明函数
*函数表达式
*new Function()
可以用Function来创建函数:
语法:
```js
var 函数名 = newFunction(); //创建一个空的函数
var 函数名 = newFunction("函数体") //创建一个没有参数的函数
var 函数名 = newFunction("参数1","参数2", "参数3",..."函数体")
//当给Fucntion传多个参数的时候,最后一个参数为函数体,前面的参数为创建出来的函数的形参
//Function接收的所有的参数都是字符串类型的!!!
```
## arguments对象(伪数组)
arguments对象是函数内部的一个对象,在函数调用的时候,系统会默认的将所有传入的实参存入该对象
//arguments.length 可以用来表示传入实参的个数(用于判断传参的个数) //arguments.callee 指向函数本身
注意:不管有没有形参,实参都会被存入该对象
## eval
可以将字符串转换成js代码并执行
注意:当使用eval解析JSON格式字符串的时候,要注意,会将{}解析为代码段
1.可以在JSON格式字符串前面拼接"var 变量名 ="
eval("var 变量名 =" + JSON格式的字符串);
2.可以在JSON格式字符串前后拼接()
eval("("+JSON格式的字符串+")"
//3.Function和eval有什么区别 //共同点,都可以将字符串转换成js代码 //不通点 //1.Function 创建出来的是 函数 并不会直接调用,只有当手动去调用创建出来的函数的时候,才会执行 //2.eval 把字符串转成代码之后,直接就执行了
## 静态成员和实例成员
###静态成员
通过构造函数去访问的属性和方法就是静态成员
//Person.成员
###实例成员
通过对象(实例)去访问的属性和方法就是实例成员
//varp = new Person(); p.成员
若有不足请多多指教!希望给您带来帮助!