- 任何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