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()给了我,Hello但o.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
};
}());
Run Code Online (Sandbox Code Playgroud)
这样,“cp1”和“cp2”基本上是可以使用的别名,而不是对 的显式引用.call()。第一个参数是用作上下文的值。
请注意,在原型中,您不想将任何内容绑定到this,因为每个对象实例的它都是不同的。