【问题标题】:nested objects in JavaScriptJavaScript 中的嵌套对象
【发布时间】:2014-07-02 23:20:21
【问题描述】:

我在用 JavaScript 构建一些代码时遇到了一点麻烦,下面是我想如何使用代码的示例:

var instance = new myObject("foo", "bar");
var sub = new myObject.subObject("x", "y", "z");
instance.doSomething();

subObject 将无法访问 myObject 的属性(在这种情况下,例如“foo”和“bar”),而 myObject 只是简单地封装了 subObject,如果你明白我的意思的话。在本例中,“x”、“y”和“z”是 myObject.subObject 实例的局部变量。

myObject 中的函数,例如 doSomething() 本身可能会创建一些 myObject.subObject 的实例,并且可以访问 myObject 的属性,例如“foo”和“bar”。

那么myObject采取什么结构形式呢?

编辑:

我的想法是这样的:

function myObject(foo, bar) {
    this.foo = foo;
    this.bar = bar;

    this.doSomething = function() {
        var a = new this.subObject("x", "y", "z");
        var b = new this.subObject("1", "2", "3");
        console.log(a.x, a.y, a.z, b.x, b.y, b.z);
        };

    this.subObject = function(x, y, z) {
        this.x = x;
        this.y = y;
        this.z = z;
        };
}

【问题讨论】:

  • 我不确定我是否完全理解,我也不确定你是否完全理解。在第二行中,您将创建一个全新的myObject 实例,因此myObject 的实例无论如何都无法访问第一个实例中创建的任何内容。我从上面得到的是:您想要一个无法访问其父实例的subObject 方法,但也需要myObject 的其他实例部分可以。
  • myObject 是如何定义的?
  • @KevinB 他希望我们这样做。见最后一行
  • myObject.subObject 只是一个普通的构造函数。没有什么特别的事情要做来“隔离”属性。 instance 永远不会知道 sub,反之亦然。
  • 您的解决方案与您提供的示例不匹配。在您的第一个示例中,subObjectconstructor 的属性,而不是 instance 的属性。

标签: javascript


【解决方案1】:

myObject.subObject 只是一个普通的构造函数。没有什么特别的事情要做来“隔离”属性。 instance 永远不会知道 sub,反之亦然。我将构造函数名称大写,以便更清楚什么是实例,什么是协函数:

function MyObject(a, b) {
    // do stuff with a and b
}
MyObject.prototype.doSomething = function() {
    var innerSub = new MyObject.SubObject();
    // or 
    // var innerSub = new this.constructor.SubObject();
};

MyObject.SubObject = function(x, y, z) 
    // do stuff with x,y and z
};


var instance = new MyObject("foo", "bar");
var sub = new MyObject.SubObject("x", "y", "z");
instance.doSomething();

MyObject.SubObject 确实没有什么特别之处。由于函数本身就是对象,因此您可以随意添加属性。

【讨论】:

  • 这看起来像我想要做的。在你的代码中我可以在 doSomething() 中有类似var a = new this.SubObject(x, y, z) 的东西吗?
  • 你会像我展示的那样做:new MyObject.SubObject()。或者你可以做new this.constructor.SubObject()。您所需要的只是以某种方式引用MyObjectthis 指的是 instance,而不是 constructor
  • 啊好吧,我想我现在已经掌握了。
【解决方案2】:

我相信您正在寻找作曲。

如果你有一个对象A,里面有一个B,因为我们说有一个,我们说的是对象的关联。

您可以创建 AB 构造函数:

var A = function() { };

var B = function(associatedA) {
   this.parent = associatedA;
};

var instanceOfB = new B(new A());

// This provides access to "A" instance
var parent = instanceOfB.parent;

如果你想在A 中创建B 的实例,你应该不会发现那里有任何问题,因为它是关于使用常规new 运算符创建A 的实例。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多