[英]How can object == this, but object.member != this.member in Javascript?
I have an object, let's call it o
, and a reference to o
. 我有一个对象,我们称之为o
,并引用o
。
Within the scope of o
, I set a member, let's call it m
. 在o
的范围内,我设置了一个成员,让我们称之为m
。
So in o, I call: 所以在o中,我打电话给:
o.m = "blah"
Outside of o, I access m
: 在o之外,我访问m
:
console.log(o.m)
Which gives me something that isn't "blah". 这给了我一些不是“啰嗦”的东西。 I did: 我做了:
console.log(this == this.parent.o)
which returns true. 返回true。 How is this possible? 这怎么可能? I'm using Chrome 17.0.963.56 m 我使用的是Chrome 17.0.963.56 m
EDIT 编辑
Also, I've tried within object o
: 另外,我在对象o
尝试过:
this.m = "blah"
console.log(this.m) // prints "blah"
but after exiting that scope and do: 但在退出该范围后并执行:
console.log(o.m)
it prints something different. 它打印出不同的东西。
Relevant code (see this.addEvent("playPauseButtonClicked")): 相关代码(参见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);
}
...
}
If you're inside of o
, and you want to set m
, you would say: 如果你在o
里面,并且你想设置m
,你会说:
this.m = "blah";
it's possible that inside o
, o
is scoped to be something else, which is why things are not behaving as expected. 内部o
, o
的范围可能是其他东西,这就是为什么事情没有按预期运行的原因。
EDIT 2 -- it looks like OP just changed his question, so the code below probably isn't relevant anymore -- sigh 编辑2 - 看起来OP只是改变了他的问题,所以下面的代码可能不再相关 - 叹息
EDIT 编辑
It looks like there are a few problems. 看起来有一些问题。 For one: 一个:
this.p = new player();
Where your player constructor looks like 你的玩家构造函数的样子
function player(controller) {
this.controller = controller;
You're not passing anything in for controller, which is why you're getting the error about undefined p
. 你没有为控制器传递任何东西,这就是你得到关于undefined p
的错误的原因。 Try this: 尝试这个:
this.p = new player(this);
Also, in your controller constructor, once you define p
to be a property of the return object— this.p = new player(this)
—you need to refer to it as this.p
from then on; 另外,在你的控制器构造函数中,一旦你将p
定义为返回对象的属性 - this.p = new player(this)
- 你需要this.p
起将它称为this.p
; p
by itself is undeclared. p
本身是未宣布的。 So 所以
function controller() {
this.p = new player(this);
p.changeState();
console.log(p.state);
needs to be 需要是
function controller() {
this.p = new player(this);
this.p.changeState();
console.log(this.p.state);
您必须初始化变量。
var x = new o; console.log(om);
I'd change 我改变了
this.p = new player();
p.changeState();
console.log(p.state);
to 至
this.p = new player(this);
this.p.changeState();
console.log(this.p.state);
Two changes: 两个变化:
p
doesn't exist as a local variable in that context -- you need to use this.p
p
在该上下文中不作为局部变量存在 - 您需要使用this.p
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.