从这里的“javascript继承”问题判断,我将假设我的问题可能已在其他地方得到解答,我只是不理解其他解决方案...或者一般的javascript。
我的问题是,为什么下面的代码(http://jsfiddle.net/Se9ZW/2/)打印“test5”而不是“test1”?
var fake = { value:'test1'};
var fake2=fake;
fake2.value='test5';
document.getElementById('debug').innerHTML=fake.value;
这些似乎非常明显,所以我甚至有点尴尬甚至提出它但我想你必须以某种方式学习。
答案 0 :(得分:4)
fake
和fake2
是对同一对象的引用,因此完全可以预期它们会以这种方式运行。 它与继承无关。
现在,如果你想继承,一种方式(非常天真,我可能会添加)就是这样做:
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第5版 - 这是相当新的,可能无法在每个JavaScript引擎实现中使用。
在JavaScript中有几种实现/使用继承的方法。我将向您推荐其中一个解释 in accepted answer here 。
答案 1 :(得分:1)
这是因为
var fake2 = fake;
在fake2中创建假的引用。如果你在fake2中改变任何东西,假的也会被改变。
答案 2 :(得分:1)
也许你对术语感到困惑?这是一个没有“参考”和“价值”的解释:
{ value:'test1'}
是一个对象。你可以把它想象成一个装满东西的桶。在这种情况下,存储桶在命名值中有一个东西。
在第1行,你指向假桶。 在第2行,你将fake2指向假。因为假的只是指向一个桶,所以fake2也指向完全相同的桶。
在第3行,fake2.value
是存储桶中名为value
的东西。 fake2.value
在同一个桶中也是一样的。
另一种说法同样的方式是原语(思考:具体的东西)是通过值传递的,而对象(想想:容器和/或桶)是通过javascript中的引用传递的。
答案 3 :(得分:0)
因为javascript通过引用传递,意味着fake2不是假的副本,它是假的另一个名称,实际上是同一个对象。