首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何反对==,但是object.member != this.member在Javascript中呢?

如何反对==,但是object.member != this.member在Javascript中呢?
EN

Stack Overflow用户
提问于 2012-03-01 23:29:03
回答 3查看 86关注 0票数 0

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

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

所以在o中,我呼吁:

代码语言:javascript
复制
o.m = "blah"

在o之外,我访问m

代码语言:javascript
复制
console.log(o.m)

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

代码语言:javascript
复制
console.log(this == this.parent.o)

结果是真的。这怎麽可能?我用的是铬17.0.963.56米

编辑

另外,我在object o中尝试过

代码语言:javascript
复制
this.m = "blah"
console.log(this.m) // prints "blah"

但在退出这一范围之后:

代码语言:javascript
复制
console.log(o.m)

印出了不同的东西。

相关代码(参见this.addEvent("playPauseButtonClicked")):

代码语言:javascript
复制
    // 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);
        }
    ...
    }
EN

回答 3

Stack Overflow用户

发布于 2012-03-01 23:32:53

如果您在o中,并且希望设置m,您可以这样说:

代码语言:javascript
复制
this.m = "blah";

有可能在o内部,o被定义为其他的东西,这就是为什么事情没有像预期的那样运行。

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

编辑

看来有几个问题。举个例子:

代码语言:javascript
复制
this.p = new player();

玩家构造函数看起来像

代码语言:javascript
复制
function player(controller) {
    this.controller = controller;

您没有为控制器传递任何内容,这就是为什么要获得关于未定义的p的错误。试试这个:

代码语言:javascript
复制
this.p = new player(this);

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

代码语言:javascript
复制
function controller() {
    this.p = new player(this);
    p.changeState();
    console.log(p.state);

需要的是

代码语言:javascript
复制
function controller() {
    this.p = new player(this);
    this.p.changeState();
    console.log(this.p.state);
票数 2
EN

Stack Overflow用户

发布于 2012-03-01 23:33:08

您必须初始化变量。

var x = new o; console.log(o.m);

票数 0
EN

Stack Overflow用户

发布于 2012-03-01 23:54:41

我会改变

代码语言:javascript
复制
this.p = new player();
p.changeState();
console.log(p.state);

代码语言:javascript
复制
this.p = new player(this);
this.p.changeState();
console.log(this.p.state);

两个变化:

在这个上下文中,

  1. p不作为局部变量存在--您需要使用this.p
  2. the播放器构造函数,需要控制器引用
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9525823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档