1. 原型(Prototype)
在开发者工具控制台创建一个对象时会看到
在 obj 上多出了一个
__proto__
属性可以发现__proto__
属性也是一个对象,里面包含了一些熟悉的方法,比如toString
,valueOf
。__proto__
链接到的是Object对象的原型。
var anotherObject = {
a: 1
};
anotherObject.__proto__ === Object.prototype //true
特殊对象的__proto__
function Func(){}
Func.__proto__ === Function.prototype //true
var arr = []
arr.__proto__ === Array.prototype //true
2. 对象的属性访问
当试图在一个对象上进行属性访问,而对象又没有该属性时,对象内部的__proto__
定义了下一步应该在哪里找到它。而这种对象到对象的串行链接定义了对象的“原形链”,它在在解析属性时发挥作用。访问一个对象的属性将顺着原型链依次向上寻找,如果找到了就停止
3. 创建原型链接
var anotherObject = {
a: 1
};
// 创建一个链接到 `anotherObject` 的对象
var myObject = Object.create( anotherObject );
myObject.__proto__ === anotherObject //true
myObject.a //1
4. 总结
- Object 所有对象都可通过原型链访问到
- Function 所有函数可通过原型链访问到,所以函数可以使用 bind , apply 这些方法;同样Array 所有数组可通过原型链访问到,所以数组可以使用 push , pop 这些方法
- 对象的
__proto__
属性指向原型,__proto__
将对象和原型连接起来组成了原型链。访问一个对象的属性将顺着原型链依次向上寻找,找到了就停止,反之将一直遍历到原型链顶端 - 我们也可以通过
Object.create()
函数创建原型链接