简体   繁体   English

怎么可以在Javascript中对象==这个,但是object.member!= this.member?

[英]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. 内部oo的范围可能是其他东西,这就是为什么事情没有按预期运行的原因。


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: 两个变化:

  1. p doesn't exist as a local variable in that context -- you need to use this.p p在该上下文中不作为局部变量存在 - 您需要使用this.p
  2. the player constructor needs a controller reference 玩家构造函数需要一个控制器引用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM