Javascript继承问题

时间:2011-11-10 13:40:00

标签: javascript inheritance

从这里的“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;

这些似乎非常明显,所以我甚至有点尴尬甚至提出它但我想你必须以某种方式学习。

4 个答案:

答案 0 :(得分: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第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不是假的副本,它是假的另一个名称,实际上是同一个对象。