- 任何function擁有prototype 任何object擁有_proto_.
Ps: 由于prototype也是對象,所以prototype也擁有_proto_
- 原型對象在new的時候回復(fù)制給對象, 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的原型對象中默認(rèn)構(gòu)造方法 constructor等脂,
所以 test.prototype.constructor = test
- Object可以訪問proto中的所有屬性和方法郁轻, so上面的例子中
test._proto_.call = test.call;
- JS的世界中先有Object.prototype, 他不通過任何構(gòu)造出來奄抽,所以他沒有_proto_.
Function.prototype 包含call, bind,apply等。
任何prototype都實現(xiàn)了Object,所有Function.prototype._proto_ = Object.prototype
Function和Object都是通過Function構(gòu)造缭黔, 所以Function和Object的_proto_都是Function.prototype
questions:
···
person1.__proto__ 是什么入问?
Person.__proto__ 是什么丹锹?
Person.prototype.__proto__ 是什么?
Object.__proto__ 是什么芬失?
Object.prototype__proto__ 是什么楣黍?
答案:
第一題:
因為 person1._proto_ === person1 的構(gòu)造函數(shù).prototype
因為 person1的構(gòu)造函數(shù) === Person
所以 person1._proto_ === Person.prototype
第二題:
因為 Person._proto_ === Person的構(gòu)造函數(shù).prototype
因為 Person的構(gòu)造函數(shù) === Function
所以 Person._proto_ === Function.prototype
第三題:
Person.prototype 是一個普通對象,我們無需關(guān)注它有哪些屬性棱烂,只要記住它是一個普通對象租漂。
因為一個普通對象的構(gòu)造函數(shù) === Object
所以 Person.prototype._proto_ === Object.prototype
第四題,參照第二題,因為 Person 和 Object 一樣都是構(gòu)造函數(shù)
第五題:
Object.prototype 對象也有_proto_屬性窜锯,但它比較特殊张肾,為 null 。因為 null 處于原型鏈的頂端锚扎,這個只能記住吞瞪。
Object.prototype._proto_ === null