Javascript 为什么使用.call而不是直接向原型添加方法?
我正在使用一个Node.js插件,它实现了一个我想更好理解的模式Javascript 为什么使用.call而不是直接向原型添加方法?,javascript,node.js,prototype,Javascript,Node.js,Prototype,我正在使用一个Node.js插件,它实现了一个我想更好理解的模式 var Thing = function() {}; (function () { this.foo = function() {}; this.bar = function() {} }).call(Thing.prototype); 我知道这是用Thing.prototype上下文调用匿名函数。这是否意味着this.foo实际上被添加到了东西的原型中?如果有人能解释的话,这部分对我来说有点模糊 此外,与
var Thing = function() {};
(function () {
this.foo = function() {};
this.bar = function() {}
}).call(Thing.prototype);
我知道这是用Thing.prototype上下文调用匿名函数。这是否意味着this.foo
实际上被添加到了东西的原型中?如果有人能解释的话,这部分对我来说有点模糊
此外,与以下方法相比,这种方法的优点是什么:
Thing.prototype.foo = function() {};
Thing.prototype.bar = function() {};
在此代码中:
(function () {
this.foo = function() {};
this.bar = function() {}
}).call(Thing.prototype);
call(Thing.prototype)
导致匿名函数中this
的值为Thing.prototype
,因此它在Thing.prototype
上设置字段。请参阅文档,但基本上是为call
提供的第一个参数为被调用的函数设置this
的值,然后剩下的参数是函数采用的任何参数。因此,上面的代码将foo
和bar
字段添加到Thing.prototype
如果愿意,这种类型的设置字段将允许您在闭包内随时声明变量。例如:
(function () {
var _foo = 0;
this.foo = function() {
return _foo;
};
this.bar = function() {
_foo++;
}
}).call(Thing.prototype);
\u foo
变量只能通过方法直接访问
使用何种风格在很大程度上取决于偏好。我更喜欢在问题中使用第二种风格:
Thing.prototype.foo = ...
这主要是因为我使用的一些工具可以更好地使用它。(特别是jsdoc。)我更喜欢随时访问对象的所有字段。OP中的模式与使用:
(function () {
Thing.prototype.foo = function() {};
Thing.prototype.bar = function() {}
})();
但这只有在封闭函数表达式创建有用的闭包时才有用(根据Louis的回答)
我认为调用版本的键入字符少了一些,并且更容易从Thing.prototype更改为其他Thing.prototype。我同意您的看法-我认为您的第二种语法更清晰一些;第一个在我看来很傻。或者也许一个尖头或Felix King会出现并启发我们:)是否
foo
和bar
依赖于匿名函数中创建的局部变量?@user2357112不,anon函数中没有局部变量。在匿名函数中是否有方法正在使用的变量/函数?如果是这样,那么实例方法将充当闭包,具有对某些函数/对象的私有访问。这是一个这种模式有意义的用例。“这是否意味着this.foo实际上被添加到了东西的原型中?”是的,是的。