Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript嵌套对象_Javascript_Oop_Prototype - Fatal编程技术网

JavaScript嵌套对象

JavaScript嵌套对象,javascript,oop,prototype,Javascript,Oop,Prototype,我有一个关于JavaScript的问题。我目前使用的代码与下面的代码类似: function Game() { } 我想嵌套对象,以便可以像这样访问它们: var a = new Game(); a.nested_object.method(); a.nested_object.property; 我该怎么做呢?我会使用函数还是{}?或者这有什么关系?下面的代码是我所指的示例代码 function Game() { this.id; var stats = {}; } 如上所述,我

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

将“嵌套”内容添加到此
游戏中。原型

[编辑以回应下面的评论]

这个怎么样:

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 );

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

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

var a = new Game();
-- a.stats.lives;
但是,在
游戏
的实现中,这可能会很烦人,您必须将
统计数据
称为
this.stats
。当
this
引用了错误的内容时,例如在
函数(){}
表达式中,
this
的添加和混淆可能会出现

我喜欢的图案是这样的。它本质上是一个经典的OO getter函数

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

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

是的,这正是要走的路

请注意,
method()
中的将保存
nested\u对象
,而不是
游戏
实例。只有使用指向以下内容的变量,才能获取对该内容的引用:

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();

因为原型上的嵌套对象(您没有包含实例的变量)很少有意义-请参阅。

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

var a = new Game();
alert(a.stats);
在您的例子中,stats基本上是一个局部变量,而创建的对象对该变量一无所知

我会这样做:

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();
原因如下:

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

  • return语句的用途是什么?@JaPerk14如果您从构造函数返回一个值,它会覆盖返回
    this
    的默认行为,因此
    prototype
    不会被使用。谢谢@JaPerk14,我没有注意到它被用“new”调用。(我通常使用更实用的风格,避免使用新的,)我更改了上面的代码。如果你不知道自己在做什么,请从
    Game.prototype
    中小心。在没有适当警告的情况下,不要宣传此选项。我同意。使用prototype比仅仅使用
    this
    更难理解。这也可以,但是原型上的嵌套对象有不同的行为-这就是您需要了解的“var stats”和“this.stats”之间的区别?我一直认为一个应该覆盖另一个的价值。这不是它的工作方式吗?@JaPerk14:不。请看@JaPerk14不,两个完全不同的变量。如果
    this.stats
    存在,但您写入
    stats.lifes=3,这是一个错误。创建
    var stats
    不会给
    这个
    添加任何东西@Bergi真棒,我独立提出了它,但很高兴看到一个引用称getter为“聪明”:“var that=this”的目的是什么?我看到变量已声明,但从未使用过;this.nested_基元=消息将创建一个副本,而不是对象引用…@Potatoswatter:“嵌套的_原语”对我来说没有多大意义。你的确切意思是什么?@Bergi通过
    游戏
    更改值不会影响原始对象的
    var
    。带有
    nested_object
    的模式仅适用于适当的对象,这对于新手来说可能是不直观的。(你在另一篇文章中提到了这一点。)@Potatoswatter:没有“原始对象”这样的东西。
    this
    (至少在这里)和
    game
    都是合适的对象。