原型与原型链(二)

四. __proto__

JS 在建立对象(不管是普通对象仍是函数对象)的时候,都有一个叫作__proto__ 的内置属性,用于指向建立它的构造函数的原型对象。
对象 person1 有一个 __proto__属性,建立它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,因此:
person1.__proto__ == Person.prototypejavascript

请看下图:java


 

 

 
《JavaScript 高级程序设计》的图 6-1

根据上面这个链接图,咱们能获得:浏览器

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

不过,要明确的真正重要的一点就是,这个链接存在于实例(person1)与构造函数(Person)的原型对象(Person.prototype)之间,而不是存在于实例(person1)与构造函数(Person)之间。函数

注意:由于绝大部分浏览器都支持__proto__属性,因此它才被加入了 ES6 里(ES5 部分浏览器也支持,但还不是标准)。测试

五. 构造器

熟悉 Javascript 的童鞋都知道,咱们能够这样建立一个对象:
var obj = {}
它等同于下面这样:
var obj = new Object()ui

obj 是构造函数(Object)的一个实例。因此:
obj.constructor === Object
obj.__proto__ === Object.prototypespa

新对象 obj 是使用 new 操做符后跟一个构造函数来建立的。构造函数(Object)自己就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差很少。只不过该函数是出于建立新对象的目的而定义的。因此不要被 Object 吓倒。prototype


同理,能够建立对象的构造器不单单有 Object,也能够是 Array,Date,Function等。
因此咱们也能够构造函数来建立 Array、 Date、Function设计

var b = new Array(); b.constructor === Array; b.__proto__ === Array.prototype; var c = new Date(); c.constructor === Date; c.__proto__ === Date.prototype; var d = new Function(); d.constructor === Function; d.__proto__ === Function.prototype; 

这些构造器都是函数对象:code

 
函数对象

六. 原型链

小测试来检验一下你理解的怎么样:

  1. person1.__proto__ 是什么?
  2. Person.__proto__ 是什么?
  3. Person.prototype.__proto__ 是什么?
  4. Object.__proto__ 是什么?
  5. Object.prototype__proto__ 是什么?

答案:
第一题:
由于 person1.__proto__ === person1 的构造函数.prototype
由于 person1的构造函数 === Person
因此 person1.__proto__ === Person.prototype

第二题:
由于 Person.__proto__ === Person的构造函数.prototype
由于 Person的构造函数 === Function
因此 Person.__proto__ === Function.prototype

第三题:
Person.prototype 是一个普通对象,咱们无需关注它有哪些属性,只要记住它是一个普通对象。
由于一个普通对象的构造函数 === Object
因此 Person.prototype.__proto__ === Object.prototype

第四题,参照第二题,由于 Person 和 Object 同样都是构造函数

第五题:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。由于 null 处于原型链的顶端,这个只能记住。
Object.prototype.__proto__ === null

相关文章
相关标签/搜索