更改此内部对象的行为

时间:2014-11-09 18:41:25

标签: javascript jquery

我有两个对象,即

var Parent = { };

var Child = {
    born : function () {
        Parent.beHappy = this.study;
    },

    study : function () {
        console.log("Studying!");
        console.log("Now I'm going to play");
        this.play();
    },

    play : function () {
        console.log("Playing!");
    }
}

现在,我正在做的是

Child.born();
Parent.beHappy();

正如您所看到的,Parent.beHappy()调用了study子方法。现在我遇到的问题是,在study方法中,我无法调用this.play()。原因是,为什么会这样,因为在study()上调用了Parent,因此this在这里指的是Parent而不是Child。我有什么方法可以this方法study总是引用Child而不是Parent?我知道我可以在Child.play()方法中study使其正常工作,但我希望在我的代码中保持一致,并且更喜欢this。此外,我可以$.proxy(Parent.beHappy, Child)(),但我不想更改此Parent.beHappy()函数调用,因为它将由最终用户使用。我已经尝试了所有的东西,但现在我已经没有想法了。任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

使用.bind() js方法设置上下文:

Parent.beHappy = this.study.bind(this);

或者为了支持更旧的浏览器,请使用jQuery $ .proxy():

Parent.beHappy = $.proxy(this.study, this);



var Parent = { };

var Child = {
    born : function () {
        Parent.beHappy = $.proxy(this.study, this);
    },

    study : function () {
        snippet.log("Studying!");
        console.log("Studying!");
        console.log("Now I'm going to play");
        snippet.log("Now I'm going to play");
        this.play();
    },

    play : function () {
        console.log("Playing!");
        snippet.log("Playing!");
    }
}

Child.born();
Parent.beHappy();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;