当你写
instance1.x = 2;
您添加了一个名为x
到instance1
新属性。
原型instance1
,你可以用instance1.__proto__
查找,不受影响。的instance1.__proto__.x
值仍为1
当您参考
instance1.x
对象的自身属性instance1.x
优先于原型的财产instance1.__proto__.x
。我们说x
对instance1
阴影x
对instance1.__proto__
。
当JavaScript评估instance1.x
时,它会在向上移动原型链之前检查自己的属性instance1
。因此,您所看到的属性值为instance1.x
。
但是,当你写
instance1.colors
对象instance1
不具有自己的财产被称为colors
。因此,JavaScript会查看其原型。它找到instance1.__proto__.colors
并返回其当前值。
当你写
instance1.colors.push("black");
你没有一个新的属性添加到instance1
。您只需修改阵列instance1.__proto__.colors
。具有相同原型的所有对象都将看到相同的值colors
,除非它们具有影响colors
的属性。
在下面的代码片段,我已经做了第三个对象,c
,它定义了自己的财产被称为colors
,其阴影原型的财产c.__proto__.colors
。
var c = new SubType();
c.colors = [ 'orange', 'purple' ];
自身属性c.colors
的值是不同的阵列比原型的属性c.__proto__.colors
。对象没有自己的属性colors
将继续看到原型的价值colors
。
function SuperType() {
this.colors = ["red", "blue", "green"];
this.x = 1;
}
function SubType() {}
SubType.prototype = new SuperType();
var a = new SubType();
a.colors.push("black");
a.x = 2;
message('a.colors: ' + a.colors.join(', ')); // red, blue, green, black (prototype's colors)
message('a.x: ' + a.x); // 2 (own property x)
message('a.__proto__.x: ' + a.__proto__.x); // 1 (prototype's x)
var b = new SubType();
message('b.colors: ' + b.colors.join(', ')); // red, blue, green, black (prototype's colors)
message('b.x: ' + b.x); // 1 (prototype's x)
var c = new SubType();
// Make an own property, colors, that shadows the prototype's property.
c.colors = [ 'orange', 'purple' ];
message('c.colors: ' + c.colors.join(', ')); // orange, purple (own property colors)
message('b.colors: ' + b.colors.join(', ')); // red, blue, green, black (prototype's colors)
message('a.colors: ' + a.colors.join(', ')); // red, blue, green, black (prototype's colors)
function message(line) {
document.getElementById('messageBox').innerHTML += line + '<br>';
}
body {
font-family: sans-serif;
}
<div id="messageBox"></div>
刚刚创建SubType'的'一个新的实例。尝试 'var instance2 = instance1' – Cyval
数组和对象通过引用传递,而对于基本类型(字符串,数字等)引用是值,[related](http://stackoverflow.com/questions/518000/IS-JavaScript的一个通按引用-或通按值的语言) – maioman