JavaScript嵌套对象
我有一个关于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 = {}; } 如上所述,我
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
都是合适的对象。