四. __proto__
js 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。
对象 person1 有一个 __proto__属性,创建它的构造函数是 person,构造函数的原型对象是 person.prototype ,所以:
person1.__proto__ == person.prototype
请看下图:
根据上面这个连接图,我们能得到:
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()
obj 是构造函数(object)的一个实例。所以:
obj.constructor === object obj.__proto__ === object.prototype
新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 person 差不多。只不过该函数是出于创建新对象的目的而定义的。所以不要被 object 吓倒。
同理,可以创建对象的构造器不仅仅有 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;
这些构造器都是函数对象:
六. 原型链
小测试来检验一下你理解的怎么样:
person1.__proto__ 是什么?
person.__proto__ 是什么?
person.prototype.__proto__ 是什么?
object.__proto__ 是什么?
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
以上就是详解js原型和原型链(二)的详细内容。