如何访问我的实例'this'从揭示原型

How do I access my instance 'this' from revealing prototype?

本文关键字:this 原型 实例 何访问 访问 我的      更新时间:2023-09-26

我想使用揭示原型模式,假设我有一个简单的对象

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

我该怎么做?

因为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"answers"cp2"基本上是别名,可以用来代替对.call()的显式引用。第一个参数是要用作上下文的值。

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