JavaScript多维对象

6

我正在尝试使用以下代码在JavaScript中定义一个多维对象:

function A(one, two) {
    this.one = one;
    this.inner.two = two;
}

A.prototype = {
    one: undefined,
    inner: {
        two: undefined
    }
};
A.prototype.print = function() {
    console.log("one=" + this.one + ", two=" + this.inner.two);
}

var a = new A(10, 20);
var b = new A(30, 40);
a.print();
b.print();

结果是:

one=10, two=40
one=30, two=40

, but I expect

one=10, two=20
one=30, two=40

我做错了什么? 变量inner是类变量,不是实例变量吗?

JavaScript引擎:Google V8。


1
在 JavaScript 中思考时,不要考虑“实例”,而要考虑“作用域”。 - Hogan
@Hogan,说得好。 记住,尽管JS有类似类的结构,但它们实际上是一等对象,并且需要像处理对象一样对待它们。 - Matt Molnar
2个回答

6

因为内部对象文字inner的字面值会被所有实例共享。它属于原型,因此每个实例都共享相同的对象。为了避免这种情况,您可以在构造函数中创建一个新的对象文字。


1
+1:但是你能否展示一下创建新对象字面量的代码? - Hogan
基本上相同的事情只需要在构造函数中完成。this.inner = {two: two}; - Matt Molnar
是的,它解决了我的问题。但在这种情况下,代码变得不太有文档说明。 - ZeroDivisi0n
@ZeroDivisi0n,我明白你的意思,如果这有助于文档编写,你可以将这样的初始化移动到init()方法中。看起来你正在使用类概念进行编码,而JavaScript没有类。此时,你的prototype只能是A.prototype = {}。考虑使用prototype来共享实例之间想要共享的内容。因此,你不应该期望它详尽地记录你的“类”及其上可能存在的每个属性。构造函数或init()函数可能是列出所有这些内容的最佳位置。 - Matt Molnar

1

inner 部分是一个全局对象,不绑定于一个实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接