如何通过显示原型来访问我的实例'this'?

时间:2014-06-23 13:45:59

标签: javascript this revealing-prototype

我想使用Revealing Prototype模式,让我说我有一个简单的对象

function Obj(name) {
    this.name = name;
}

Obj.prototype = (function() {
    var p1 = function() {
        return p2();
    };

    var p2 = function() {
        return this.name;
    };

    return {
        f1: p1,
        f2: p2
    };
}());

我用

构建
var o = new Obj('Hello');

现在o.f2()给了我Helloo.f1()给了我undefined。我可以通过p2.call(this)这样的调用传递范围来解决这个问题,但是这会变成很多函数的结果。理想情况下,我希望能够执行self = this类型分配,以便我可以在代码中的任何位置self.name进行。{/ p>

我该怎么做?

1 个答案:

答案 0 :(得分:1)

因为JavaScript函数调用的本质是它的本质,并且因为原型代码必须适用于它的任何“客户”对象,所以很难消除对上下文的显式管理(this)。一种可能优于在整个地方使用.call().apply()的方法是转换函数,使得上下文成为显式参数。您可以使用.call().bind()

执行此操作
Obj.prototype = (function() {
    var p1 = function() {
        return cp2(this);
    };

    var p2 = function() {
        return this.name;
    };

    var cp1 = p1.call.bind(p1);
    var cp2 = p2.call.bind(p2);

    return {
        f1: p1,
        f2: p2
    };
}());

有了它,“cp1”和“cp2”基本上是可以用来代替.call()的显式引用的别名。第一个参数是要用作上下文的值。

请注意,在原型中,想要将任何内容绑定到this,因为它对每个对象实例都不同。