JavaScript嵌套对象

时间:2013-01-11 01:28:55

标签: javascript oop prototype

我对JavaScript有疑问。我目前正在使用类似于以下代码的代码:

function Game() {

}

我想嵌套对象,所以我可以这样访问它们:

var a = new Game();
a.nested_object.method();
a.nested_object.property;

我该怎么做呢?我会使用函数还是{}?或者甚至重要吗?下面的代码是我所指的示例代码。

function Game() {

this.id;

var stats = {};

}

就像我上面所述,我可以像这样访问统计数据:

var a = new Game();
a.stats

6 个答案:

答案 0 :(得分:5)

我会这样做:

function Game() {
    this.id;
    this.stats = new Stats(this);
}

function Stats(game) {
    this.property;
    this.method = method;

    function method() {
        this.property;
        game.id;
    }
}

var game = new Game;
game.stats.method();

原因如下:

  1. 关注点分离 - 游戏构造函数可以完全专注于游戏逻辑,统计构造函数将只关注游戏的统计数据。
  2. 模块化 - 您可以将游戏构造函数和stats构造函数放在两个不同的文件中。这使您可以单独处理它们,使项目更易于管理。
  3. 松散耦合 - 统计对象无需了解游戏对象。所以最好将它与游戏对象分开。如果你使用对象文字表示法来创建它(如@Bergi所做的那样),那么stats对象可以访问游戏对象的私有成员(如果stats对象意外地改变了游戏对象的私有属性,这可能会适得其反。 )。
  4. 可读性 - 比较@ Bergi的代码和我的代码。分离统计数据和游戏对象使代码更易于阅读和理解。您可以只看一眼代码并确切知道发生了什么。

答案 1 :(得分:2)

是的,这正是要走的路。

请注意,method()中的this keyword将保留nested_object,而不是您的Game实例。只有使用指向:

的变量,才能获得对它的引用
function Game() {
    var that = this; // the Game instance
    this.id = …;
    this.nested_object = {
        property: "nested!",
        method: function() {
            this.property; // nested! (=== that.nested_object.property)
            that.id // the game property
        }
    };
}
var game = new Game;
game.nested_object.method();

由于原型上的嵌套对象(你没有包含实例的变量)很少有意义 - 请参阅Crockford's Prototypal inheritance - Issues with nested objects

答案 2 :(得分:0)

将“嵌套”内容添加到thisGame.prototype

答案 3 :(得分:0)

[编辑回复以下评论]

这个怎么样:

function Game() {

    this.nested_object = {
        method: function () {
            return 'method return value';
        },

        property: 'property value'
    };

};

var a = new Game();
alert( a.nested_object.method() );
alert( a.nested_object.property );

答案 4 :(得分:0)

只需在构造函数中创建嵌套对象。

function Game() {
    this.stats = { lives: 3 };
};

var a = new Game();
-- a.stats.lives;

然而,这可能很烦人,因为在Game的实施中,您必须将stats称为this.stats。如果this引用了错误的内容,例如this表达式内部,function(){}会加起来并引起混淆。

我的首选模式如下所示。它本质上是一个经典的OO getter功能。

function Game() {
    var stats = { lives: 3 };
    this.stats = function() { return stats; };
};

var a = new Game();
-- a.stats().lives;

答案 5 :(得分:0)

这应该更合适

function Game() {
  this.id;
  this.stats = "Hello";
  return this;
}

var a = new Game();
alert(a.stats);

基本上在您的情况stats is a local variable中,创建的对象不知道变量。

<强> Check Fiddle