2017-02-03 56 views
1

我試圖解釋當我被一個事實證明這不能像我期望的那樣工作時,對原型繼承給同事的罕見用例。不應該分配給原型屬性在原型上重寫它嗎?

const baseobj = { baseproperty: 'original'}; 
 

 
const x = Object.create(baseobj); 
 

 
//should add properties to x, not the base 
 
x.newproperty = 'bar'; 
 
console.assert(x.newproperty != baseobj.newproperty); 
 
//so far so good 
 

 
//should modify the base, not x 
 
x.baseproperty = 'foo'; 
 
console.assert(x.baseproperty == baseobj.baseproperty); 
 
//this assert failed, property is on x!?

我很困惑。據我瞭解,分配是一個分兩步的過程,一個是查看屬性,另一個是分配給它。那麼爲什麼在查找baseproperty不返回(因此修改)baseobj.baseproperty

我知道東西像這樣是angularjs範圍如何工作的關鍵,但具體是怎麼發生在這裏沒有我。

+1

如果確實如此,那將會很糟糕。這意味着分配給一個屬性可能會隱含地改變碰巧具有相同原型的其他對象。最簡單的例子:'({})。toString = 42;'。 *每個*對象的'toString'屬性現在應該是'42'嗎? –

+0

我不確定我是否知道您在Angular中的想法,但如果您發佈某種示例,這將會很有趣。 – Pointy

回答

2

指定對象實例上的屬性總是在目標對象上創建一個「自己」屬性(當然,如果某個對象不存在的話)。即使原型屬性與名稱匹配,Prototype屬性也不會受此類賦值影響。

當然,賦值後,對象的「自己」屬性隱藏了原型鏈屬性。

+0

即使是在原型上存在的? –

+0

@GeorgeMauer是的,即使是在原型上存在的。換句話說,修改原型鏈屬性的唯一方法是直接在適當的原型對象上找到它並在那裏更改它。 – Pointy

+0

你介意提供一個參考嗎?我敢肯定,我讀過這兩步過程是核心之前(雖然顯然我有相反的證據) –