我想使用揭示原型模式,假设我有一个简单的对象
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
。
我该怎么做?
因为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"one_answers"cp2"基本上是别名,可以用来代替对.call()
的显式引用。第一个参数是要用作上下文的值。
请注意,在原型中,不希望将任何内容绑定到this
,因为每个对象实例都不同。