2014-10-08 140 views
0

考慮下面的代碼:對象實例共享子屬性?

var Car = function() {}; 

Car.prototype = { 
    wheels: { 
    rims: 'steel' 
    } 
} 

var volvo = new Car; 
var mercedes = new Car; 

volvo.wheels.rims = 'aluminium'; 

console.log(volvo.wheels.rims, mercedes.wheels.rims); // 'aluminium', 'aluminium' 

你能解釋爲什麼實例Automercedes自動繼承了rimsvolvo子屬性定義?

注意下面的代碼工作正常使用相同的設置:

volvo.wheels = 4; 

console.log(volvo.wheels, mercedes.wheels); // 4, Object { rims: 'steel' } 
+3

因爲'wheels'是一個原型屬性。 – dfsq 2014-10-08 15:52:11

+4

每個'car'共享*相同的*對象'wheels'。應該在構造函數內創建特定於實例的屬性。 – 2014-10-08 15:52:19

+0

也許以下可以幫助理解原型,構造函數和變異與賦值成員(與原型結合)。 http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR 2014-10-09 02:45:28

回答

2

你永遠只能創建一個對象wheels

您將此對象分配給原型,以便每個實例繼承其值。

Javascript will never自動複製一個對象。

相反,您應該在構造函數中創建對象,以便爲每個實例獲取一個新對象。