我想使用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()
给了我Hello
但o.f1()
给了我undefined
。我可以通过p2.call(this)
这样的调用传递范围来解决这个问题,但是这会变成很多函数的结果。理想情况下,我希望能够执行self = this
类型分配,以便我可以在代码中的任何位置self.name
进行。{/ p>
我该怎么做?
答案 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
,因为它对每个对象实例都不同。