JavaScript中有兩個特殊的對象:Object與Function。Object.prototype是所有對象的原型,處於原型鏈的最底層。Function.prototype是所有函數對象的原型,包括構造函數。我把JavaScript中的對象分爲三類,一類是用戶創建的對象,一類是構造函數對象,一類是原型對象。這三類對象中每一類都有__proto__屬性,通過它可以遍歷原型鏈,追溯到原型鏈的最底層。構造函數對象還有prototype屬性,指向一個原型對象,通過該構造函數創建對象時,被創建的對象的__proto__屬性將會指向構造函數的prototype屬性。原型對象有constructor屬性,指向它對應的構造函數。
例如下面的代碼:
function Foo(){
}
var foo = new Foo();
var obj = new Object();
爲了說明這之間複雜的關係,我畫了一個圖:
JavaScript中通過原型實現繼承的本質就是一個對象可以訪問到它的原型鏈上任何一個原型對象的屬性,例如上圖foo對象,它擁有foo._proto__以及foo._proto._proto__所有屬性的淺拷貝(只拷貝基本數據類型,不拷貝對象)。所以可以直接訪問foo.constructor(來自foo._proto,即Foo.prototype),foo.toString(來自foo._proto_._proto_,即Object.prototype)。
foo._proto._proto所有屬性的淺拷貝(只拷貝基本數據類型,不拷貝對象)
对这句有疑问,应该是都不做任何拷贝吧?而是需要的时候去沿着链"查找"
问一个问题: 我直接在交互模式下定义function,然后创建对象,发现交互模式直接可以显示对象的原型方法. 不过将同样的代码写成js文件,通过node debug模式,用repl跟踪时,发现对象的原型方法不是直接显示的(当然通过__proto__可以看到). 有谁清楚这个吗?