我有一个对象,我们称它为o,以及对o的引用。
在o的范围内,我设置了一个成员,让我们称之为m。
所以在o中,我呼吁:
o.m = "blah"在o之外,我访问m
console.log(o.m)这给了我一些不是“废话”的东西。我做了:
console.log(this == this.parent.o)结果是真的。这怎麽可能?我用的是铬17.0.963.56米
编辑
另外,我在object o中尝试过
this.m = "blah"
console.log(this.m) // prints "blah"但在退出这一范围之后:
console.log(o.m)印出了不同的东西。
相关代码(参见this.addEvent("playPauseButtonClicked")):
// Controller code (singleton)
function controller() {
if (window.c) { return window.c; }
window.c = this;
...
// Event handling
this.addEvent = function(eventName, callback) {
if (!this.events[eventName]) this.events[eventName] = [];
this.events[eventName].push(callback);
}
this.raiseEvent = function(eventName) {
self = getController();
if (self.events[eventName]) {
var callbacks = self.events[eventName];
var i = 0;
for (i = 0; i<callbacks.length; ++i) {
callbacks[i]();
}
}
}
this.musicplayer = new zeitgeistPlayer(this, this.songStatus);
...
this.addEvent("playPauseButtonClicked", function() {
var controller = getController();
var musicplayer = controller.musicplayer;
switch (musicplayer.state) {
case "paused":
musicplayer.resume();
controller.view.setButtonProperty("playPauseButton", "pause", true);
break;
case "playing":
musicplayer.pause();
controller.view.setButtonProperty("playPauseButton", "pause", false);
break;
case "stopped":
controller.playSong();
controller.view.setButtonProperty("playPauseButton", "pause", true);
break;
}
});
if (this.playQueue.length == 0) this.view.setButtonProperty("playPauseButton", "disabled", true);
this.raiseEvent("controllerLoaded");
}
// Functional classes
function basePlayer(songStatus) {
this.state = "stopped"; // states are: stopped, playing, paused
...
}
// implementation of basePlayer using the zeitgeist flash player
function zeitgeistPlayer(controller, songStatus) {
$.extend(this, new basePlayer(songStatus));
...
this.controller = controller;
...
this.pause = function () {
if (this.controller.debug) console.log("player pausing");
this.state = "paused";
this.swf.pauseSong();
if (this.controller.debug) console.log("player "+this.state);
console.log(this);
console.log(getController().musicplayer);
console.log(this==getController().musicplayer);
}
...
}发布于 2012-03-01 23:32:53
如果您在o中,并且希望设置m,您可以这样说:
this.m = "blah";有可能在o内部,o被定义为其他的东西,这就是为什么事情没有像预期的那样运行。
编辑2 --看起来OP改变了他的问题,所以下面的代码可能不再相关了--叹息
编辑
看来有几个问题。举个例子:
this.p = new player();玩家构造函数看起来像
function player(controller) {
this.controller = controller;您没有为控制器传递任何内容,这就是为什么要获得关于未定义的p的错误。试试这个:
this.p = new player(this);而且,在控制器构造函数中,一旦将p定义为返回对象的属性--this.p = new player(this)-you需要从那时起将其称为this.p;p本身是未声明的。所以
function controller() {
this.p = new player(this);
p.changeState();
console.log(p.state);需要的是
function controller() {
this.p = new player(this);
this.p.changeState();
console.log(this.p.state);发布于 2012-03-01 23:33:08
您必须初始化变量。
var x = new o; console.log(o.m);
发布于 2012-03-01 23:54:41
我会改变
this.p = new player();
p.changeState();
console.log(p.state);至
this.p = new player(this);
this.p.changeState();
console.log(this.p.state);两个变化:
在这个上下文中,
p不作为局部变量存在--您需要使用this.phttps://stackoverflow.com/questions/9525823
复制相似问题