- 任何function拥有prototype 任何object拥有_proto_.
Ps: 由于prototype也是对象,所以prototype也拥有_proto_
- 原型对象在new的时候回复制给对象, object._proto_ = function.prototype
e.g function test(){}和var test = new Function()是等价的
test是Function的一个对象
Function中拥有prototype: bind(), call(), apply()等.
所以test._proto_ = Function.prototype, test可以访问bind, call, apply等
如果new 一个test的对象a, a = new test();
a._proto = test.prototype
此外所有function的原型对象中默认构造方法 constructor,
所以 test.prototype.constructor = test
- Object可以访问proto中的所有属性和方法, so上面的例子中
test._proto_.call = test.call;
- JS的世界中先有Object.prototype, 他不通过任何构造出来,所以他没有_proto_.
Function.prototype 包含call, bind,apply等。
任何prototype都实现了Object,所有Function.prototype._proto_ = Object.prototype
Function和Object都是通过Function构造, 所以Function和Object的_proto_都是Function.prototype
questions:
···
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