2011-11-10 38 views
2

由「javascript繼承」的問題來判斷我在這裏假設我的問題可能已經在其他地方回答了,我只是沒有理解其他解決方案......或者一般來說顯然是javascript。JavaScript的繼承問題

我的問題是,爲什麼下面,而不是「測試1」(http://jsfiddle.net/Se9ZW/2/)打印「TEST5」的代碼?

var fake = { value:'test1'}; 
var fake2=fake; 
fake2.value='test5'; 
document.getElementById('debug').innerHTML=fake.value; 

這些看起來似乎是很明顯的,因此我有點尷尬,甚至是把它了,但我猜啊,你必須學會​​莫名其妙。

+0

在這裏看到:http://stackoverflow.com/questions/728360/copying-an-object-in-javascript – Irishka

回答

4

fakefake2是對同一個對象的引用,所以完全可以預見它們的行爲方式。 它與繼承無關。

現在,如果你想繼承,一種方法(很幼稚,我可以補充)會做這樣的:

var fake = { value:'test1'}; 
var fake2 = Object.create(fake); //creates a new object with fake as prototype 
fake2.value = 'test5'; // "overrides" the value property from the prototype 
console.log(fake.value); 

,然後輸出將是:

test1 

請注意,這是來自ECMAScript Edition 5 - 這是相當新的,可能不適用於那裏的每個JavaScript引擎實現。

有幾種方法可以在JavaScript中實現/使用繼承。我打算向你推薦一個解釋in accepted answer here

+0

輝煌。這是完全意義上的,這是我以前碰到的東西......不知何故。 – malonso

1

這是因爲

var fake2 = fake; 

創建成fake2假的參考。如果你改變了虛假2中的任何東西,假也會被改變。

0

因爲JavaScript經過參考,這意味着fake2不是假的拷貝,它是假的同一對象的和實際上的另一個名稱。

1

也許你對術語感到困惑?這裏的無詞的「參考」和「價值」的解釋:

{ value:'test1'}是一個對象。你可以把它想成一個充滿了事物的桶。在這種情況下,存儲桶在命名值內有一件事。

在第1行,您指向虛擬機。 在第二行,你指的是假2。由於假幣只是指向一個桶,假2也指向完全相同的桶。

在第3行,fake2.value是在桶命名value的東西。 fake2.value在同一個桶中是相同的東西。

另一種方式說同樣的事情是原語(認爲:具體的事物)的價值傳遞,和對象(想一想:容器和/或桶)通過在JavaScript中引用傳遞。

+1

我可能會避免聲稱在JavaScript中通過引用傳遞某些東西...它是通過值傳遞的引用。 – ZenMaster

+0

+1好點,ZenMaster – Upgradingdave