在JavaScript中,當給建構函式的物件重新賦值之後,再建立物件,為什麼物件的建構函式變成Object了?

時間 2021-05-13 05:16:36

1樓:蘇哈哈

已經過了這麼久想必題主已經搞明白了,但是木有人回答為什麼這樣設計嗎。我來強答一波加深自己的印象咯。

的確靈異,的確應該是constructor設計上迷惑初學者的地方,constructor只是prototype上的乙個物件而已。

我猜把constructor設計為prototype上的物件本意應該是更方便更符合語義吧,你看通過例項.constructor就能得到"建構函式"啦,好直白好明了。

然而深究下去就會出現靈異現象了2333,你不得不去深入理解js的原型機制,大概這樣設計就是要你深入學習js。2333原型鏈是指[[GET]]通過[[Prototype]]在物件與物件之間搜尋形成的一條鏈路:

原型鏈是指[[GET]]通過[[Prototype]]在物件與物件之間搜尋形成的一條鏈路:

物件 -> 物件gt; 物件PrototypePrototype]]

so,constructor只是其中的物件中的乙個屬性,並不在這條鏈路的主幹上

原題應翻譯為:

newDog.__proto__.constructor // Object() <= 為什麼要這樣設計更靈異的事情出現了

typeof newDog.__proto__.constructor(這時候已經沒有啦).prototype.paws // "undefined"

typeof dog.__proto__(原來的prototype物件).constructor.

prototype(新建的prototype物件).paws // "number" 當初設計這個是出於什麼樣的思考

2樓:陳子賤愛笑

可以這樣理解:newDog.prototype.

constructor-->.constructor-->.prototype.

constructor-->Object

3樓:

題主的問題是用了乙個新值來替換了prototype屬性的預設值,但這樣會清除在原來原型物件中找到的預設constructor屬性。可以在手動設定乙個 Dog.prototype=

typeof dog.constructor.prototype.paws // "number"

這是因為建立例項時,該例項會繫結至剛完成的原型,替換prototype並不會更新以建立例項和原型之間的鏈結

4樓:

Dog.prototype 重寫了建構函式的原型物件,變成了乙個新的物件。假設新物件為 a ,a 其實是通過 a = new Object() 弄出來的。

然後在 new Dog() 的時候 newDog 的[[Prototype]] 就變了 a,查詢 newDog.constructor 時會在 a.[[Prototype]],也就是 Object.

prototype 裡查詢,所以得到的結果是 Object。

理解了這個之後,剩下的問題簡單了。newDog.constructor.

prototype 是 Object.prototype,所以是沒有 paws 屬性的,而 dog.constructor.

prototype 是新定義的 a,是數字4,所以 typeof 顯示 number。

5樓:

題主你後面新增爪子直接把乙個plain object覆蓋到了prototype了上啊,原來的paws方法當然沒有了。

js(這裡指es5)是原型繼承,也就是說其實沒有類這個概念。

直接把prototype替換掉,新物件就照著新模子生成物件。而老物件是過去生成的,原型鏈是老原型鏈,不會被改變。

你試著看一下dog.__proto__就知道了。

至於建構函式,正如 @孔祥舟 所說,在題主未覆蓋原型之前constructor就在原型裡,只不過它是不可列舉的,所以直接列印出來是看不到的。也就是說定義Dog函式的時候prototype就初始化好了,而且不是乙個普通的物件。

新建物件的過程可以理解為,執行建構函式的開頭隱式地新建了個空物件this,並且把建構函式的prototype屬性賦給了this.__proto__。

請問在javascript中undefined和null與其他字串的進行邏輯運算有什麼規律嗎?感覺好亂 這個有用嗎?

周中原 邏輯運算不一定返回false或者true,還有可能返回其他值。題主只問了undefined和null,另外送NaN的情況 免費 與 運算元中任意乙個是null undefined NaN,則返回對應的null undefined NaN 例如 null 任意型別 返回null 若兩個運算元是...

在 JavaScript 中,如何求出兩個陣列的交集和差集?

nbili 給個繞的寫法 let a stewed tomatoes and macaroni let b macaroni and cheese function intersect a,b else if b.includes a 0return a 0 intersect a.slice 1 ...

在企業中,當秦檜還是當岳飛好?

無聊玩家 南宋公司倒閉了。岳飛,同行其他公司是巴不得要,不愁沒地方去。秦檜,直接換行吧,不然可能一輩子要在底層了,起碼這行的公司不會再讓你走進核心了,誰不知道你是什麼玩意啊? 塵土 先說答案 秦檜。見風使舵,自古以來,這都是乙個貶義的詞彙,因其不符合儒家學說,受到道德譴責。可事實上,國內的環境就是如...