簡體   English   中英

在對象文字上擴展原型

[英]Extending prototype on object literal

如果我有以下代碼,為什么它返回一個錯誤,提示無法設置undefined的屬性“ second_prop”。 我認為您可以擴展原型屬性,並向對象原型添加更多變量和方法。 由於這兩個控制台語句返回“ Object”和true,因此為什么返回未定義的錯誤。 我的想法是,如果“ obj”是Object類型的對象,那么我應該能夠執行temp.prototype.newproperty嗎? 因此,對象將具有“新屬性”。 但是我顯然錯了,所以這里有些我想念的東西。 還有,當obj已經是對象文字時,為什么還要做Object.create()? 它已經不是一個對象了嗎? 我只是看一些例子並試圖理解這一點

    var obj = {
        first_property: 'first property'
    }
    console.log(typeof obj);
    console.log(obj instanceof Object);

    var temp = Object.create(obj);
    temp.prototype.second_prop = 'second property'

輸出量

//object
//true
//Uncaught TypeError: Cannot set property 'second_prop' of undefined

那么,為什么我不能做temp.prototype或obj.prototype?

如果我有以下代碼,為什么會返回錯誤,提示無法設置未定義的屬性“ second_prop”

Javascript文字對象已經是實例化的對象,並且不具有.prototype屬性。 該屬性位於構造函數上,而不是已實例化的對象上。 在任何當前瀏覽器(IE9 +)中,您都可以使用Object.getPrototypeOf()獲取已構建對象的原型。

但是,這聽起來更像是您寧願克隆對象,然后向克隆添加屬性。 或者,如果您希望兩個對象都具有相同的附加屬性,則添加該屬性,然后對其進行克隆。 或者,如果您只想使用文字對象,則按原樣使用它。

構造完對象后,原型便是內部屬性,通常並不意味着您要弄亂它。 如果要更改所有對象的原型,則應在構造函數上更改原型。 如果要更改對象的此實例的屬性,則只需更改對象本身(而不是原型)的屬性。

與往常一樣,如果您描述了您實際要完成的工作(而不是為什么您自己的解決方案沒有達到您的期望),我們可以為您提供更好的幫助。

我認為您可以擴展原型屬性,並向對象原型添加更多變量和方法。

您可以,但是.prototype屬性在構造函數上,而不在已構建的對象上。

由於這兩個控制台語句返回“ Object”和true,因此為什么返回未定義的錯誤。 我的想法是,如果“ obj”是Object類型的對象,那么我應該能夠執行temp.prototype.newproperty嗎?

您將實例化的對象與原型的構造函數混為一談。 實例化的對象具有作為內部屬性的原型,而不是作為公共.prototype屬性的原型。 因此,當某物報告instanceof時,這意味着它實際上是該對象類型的實例(因此在其內部原型鏈中具有該類型的對象原型),而不是它是具有public .prototype屬性的構造函數。

還有,當obj已經是對象文字時,為什么還要做Object.create()? 它已經不是一個對象了嗎?

Object.create()的目的是使用現有對象作為原型來創建一個新對象。 如果您被聲明為Javascript文字,而您只想將文字本身用作對象,則沒有理由在其上使用Object.create() 只需將文字用作其已經構建的對象即可。

temp沒有原型。 對象具有原型。 您可以通過調用Object.prototype更改所有對象的原型,但不能只更改一次對象。

.prototype是未始終鏈接到對象實際原型的屬性。 真正的原型可以通過.__proto__

var obj = {
    first_property: 'first property'
}
console.log(typeof obj);
console.log(obj instanceof Object);

var temp = Object.create(obj);

temp.__proto__.second_prop = 'second property';

console.log(Object.getPrototypeOf(temp));

//{ first_property: 'first property',
//second_prop: 'second property' }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM