4

我有一个关于 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
4

6 回答 6

6

我会这样做:

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. 模块化- 您可以将游戏构造函数和统计构造函数放在两个不同的文件中。这使您可以分别处理它们并使项目更易于管理。
  3. Loose Coupling - stats 对象不需要知道游戏对象。所以最好把它和游戏对象分开。如果您使用对象文字符号创建它(如@Bergi 所做的那样),那么 stats 对象可以访问游戏对象的私有成员(如果 stats 对象意外更改游戏对象的私有属性,这可能会适得其反)。
  4. Readability - Compare @Bergi's code and mine. Separating the stats and the game object makes the code easier to read and understand. You can have one glance at the code and know exactly what's going on.
于 2013-01-11T02:28:43.833 回答
2

是的,这正是要走的路。

请注意,您的关键字thismethod()包含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 的原型继承 - 嵌套对象的问题

于 2013-01-11T01:35:07.383 回答
0

将“嵌套”的东西添加到thisGame.prototype.

于 2013-01-11T01:32:35.383 回答
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 );
于 2013-01-11T01:33:43.230 回答
0

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

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

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

但是,这可能很烦人,因为Game您必须在实现中引用statsas this.stats。当引用错误的东西时,例如在表达式中, this'es 加起来会引起混淆。thisfunction(){}

我喜欢的模式看起来像这样。它本质上是一个经典的 OO getter 函数。

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

var a = new Game();
-- a.stats().lives;
于 2013-01-11T01:34:28.383 回答
0

这应该更合适

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

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

基本上在你的情况下stats is a local variable,创建的对象对变量一无所知。

检查小提琴

于 2013-01-11T01:50:52.250 回答