2014-10-08 102 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自动复制一个对象。

相反,您应该在构造函数中创建对象,以便为每个实例获取一个新对象。