gpt4 book ai didi

javascript - 在Javascript中,object == this,但是object.member != this.member 是如何实现的呢?

转载 作者:行者123 更新时间:2023-12-02 19:49:10 28 4
gpt4 key购买 nike

我有一个对象,我们称之为 o,以及对 o 的引用。

o范围内,我设置了一个成员,我们称之为m

所以在 o 中,我调用:

o.m = "blah"

在 o 之外,我访问 m:

console.log(o.m)

这给了我一些不“废话”的东西。我做了:

console.log(this == this.parent.o)

返回 true。这怎么可能?我使用的是 Chrome 17.0.963.56 m

编辑

另外,我在对象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);
}
...
}

最佳答案

如果您在 o 内部,并且想要设置 m,您会说:

this.m = "blah";

o 内部,o 的作用域可能是其他东西,这就是为什么事情没有按预期运行的原因。

<小时/>

编辑2——看起来OP刚刚改变了他的问题,所以下面的代码可能不再相关了——叹息

<小时/>

编辑

看起来有一些问题。其一:

this.p = new player();

你的播放器构造函数看起来像这样

function player(controller) {
this.controller = controller;

您没有向 Controller 传递任何内容,这就是您收到有关未定义p的错误的原因。试试这个:

this.p = new player(this);
<小时/>

此外,在 Controller 构造函数中,一旦将 p 定义为返回对象的属性 - this.p = new player(this) - 您需要从那时起将其称为 this.pp 本身是未声明的。所以

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

关于javascript - 在Javascript中,object == this,但是object.member != this.member 是如何实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com