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

hap*_*ore 5 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
    };
}());
Run Code Online (Sandbox Code Playgroud)

我用它构建

var o = new Obj('Hello');
Run Code Online (Sandbox Code Playgroud)

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

我该怎么做呢?

Poi*_*nty 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
    };
}());
Run Code Online (Sandbox Code Playgroud)

这样,“cp1”和“cp2”基本上是可以使用的别名,而不是对 的显式引用.call()。第一个参数是用作上下文的值。

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