Javascript继承问题

Javascript继承问题,javascript,inheritance,Javascript,Inheritance,从这里的“javascript继承”问题来看,我假设我的问题可能已经在其他地方得到了回答,我只是不理解其他解决方案……或者javascript 我的问题是,为什么下面的代码()打印“test5”而不是“test1” 这些似乎是很明显的事情,所以我甚至有点不好意思提起它,但我想你应该有所了解。这是因为 var fake2 = fake; 将fake的引用创建为fake2。如果您在fake2中更改了任何内容,fake也会更改。fake和fake2都是对同一对象的引用,因此完全可以预期它们会以这种方

从这里的“javascript继承”问题来看,我假设我的问题可能已经在其他地方得到了回答,我只是不理解其他解决方案……或者javascript

我的问题是,为什么下面的代码()打印“test5”而不是“test1”

这些似乎是很明显的事情,所以我甚至有点不好意思提起它,但我想你应该有所了解。

这是因为

var fake2 = fake;

将fake的引用创建为fake2。如果您在fake2中更改了任何内容,fake也会更改。

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 Edition 5,它是相当新的版本,可能不适用于所有JavaScript引擎实现


有几种方法可以在JavaScript中实现/使用继承。我将向您介绍其中一种解释,因为javascript通过引用传递,这意味着fake2不是fake的副本,它是fake的另一个名称,实际上是同一个对象。

也许您对术语感到困惑?这里有一个没有“参考”和“价值”的解释:

{value:'test1'}
是一个对象。你可以把它想象成一个装满东西的桶。在本例中,bucket在命名值中有一个内容

在第1行,你用假手指着水桶。 在第二行,你把fake2指向了fake。因为fake只是指向一个桶,所以fake2也指向完全相同的桶

在第3行,
fake2.value
是bucket中名为
value
的东西<代码>伪造2.值在同一个桶中是相同的东西


另一种说法是,在javascript中,原语(think:concrete things)通过值传递,对象(think:containers和/或bucket)通过引用传递

看这里:太棒了。这是完全有道理的,我以前从来没有遇到过这样的东西……不知怎么的。我可能会克制自己,不说在JavaScript中有东西是通过引用传递的。。。它是通过值传递的引用。
test1