2016-08-18 37 views
0

我一直在閱讀javascript的constructor__proto__。我想我明白__proto__屬性的基本知識,但是我對constrcutor屬性有點麻煩。這是我目前爲止所瞭解的有關這兩個屬性的信息,如果我錯了,請糾正我,或者如果我錯過了某些要點,請添加。 javascript中的每個對象都有一個名爲__proto__的「隱藏」屬性,默認情況下指向Object.prototype。現在,當使用new創建對象的實例時。修改此屬性的值並分配對象ConstructorName.prototype。我不確定什麼__proto__的默認值是在調用new之前。現在關於.constructor我有點困惑我看了this,到目前爲止認爲constructor屬性默認是空的,當新的被調用時constrcutor被修改並分配了ConstructorName.prototype.constructor 。請讓我知道我是否朝着正確的方向前進。關於構造函數和__proto__屬性的說明

回答

1

在javascript每個對象都有一個 「隱藏」 的屬性稱爲__proto__

號隱藏屬性稱爲[[原型]].__proto__是訪問它棄用吸氣,你應該使用Object.getPrototypeOf

它默認指向Object.prototype

「default」可能會引起誤解 - 取決於對象的創建方式。對於普通對象文字,是的,它是Object.prototype

現在,當一個對象的實例使用new創建。此屬性的值將被修改並分配給對象ConstructorName.prototype。我不確定__proto__的默認值是在新的被調用之前。

在此之前沒有任何價值。該對象是在原型從一開始就被設置的情況下創建的。在調用new之前,沒有任何對象。

現在關於.constructor我有點困惑我讀到這也是迄今爲止相信在默認情況下是constructor屬性是空的,被調用的新當constrcutor被修改,分配ConstructorName.prototype.constructor

不,沒有任何東西被分配到任何地方,沒有.constructor屬性的實例。他們做繼承財產(連同其他人)從.prototype對象。 在創建ConstructorName函數的實例中創建了ConstructorName.prototype.constructor屬性。

+0

感謝您的帖子。你提到「在調用new之前,沒有任何對象」,在這個問題的部分我要問的是,當我們在這種情況下聲明一個普通對象(即)'foo = {}'時,默認的'foo .__ proto__ = Object.prototype',一旦我們通過做'var f = new foo()'來創建一個實例,那麼'f .__ proto__ = foo.prototype'我是否正確? –

+0

是的。 'foo = {}'等價於'foo = Object.create(Object.prototype)','f = new foo'等同於'f = Object.create(foo.prototype); f.constructor()' – Bergi

+0

好的感謝清理。你提到的最後一個問題是「實例上沒有.constructor屬性,它們繼承了.prototype對象的屬性(以及其他屬性)。」 。第一個例子中的鏈接http://javascript.info/tutorial/constructor似乎表明該實例具有屬性'.constructor'(ie)'alert(rabbit.constructor == Rabbit)// true'我是一個這裏一點困惑。我在這裏詳細介紹嗎? –