如何理解原型和原型链

1. 原型(Prototype)

在开发者工具控制台创建一个对象时会看到


在 obj 上多出了一个 __proto__属性

可以发现__proto__属性也是一个对象,里面包含了一些熟悉的方法,比如toStringvalueOf__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. 总结

  1. Object 所有对象都可通过原型链访问到
  2. Function 所有函数可通过原型链访问到,所以函数可以使用 bind , apply 这些方法;同样Array 所有数组可通过原型链访问到,所以数组可以使用 push , pop 这些方法
  3. 对象的__proto__属性指向原型, __proto__ 将对象和原型连接起来组成了原型链。访问一个对象的属性将顺着原型链依次向上寻找,找到了就停止,反之将一直遍历到原型链顶端
  4. 我们也可以通过 Object.create()函数创建原型链接

你可能感兴趣的:(如何理解原型和原型链)