Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么使用.call而不是直接向原型添加方法?_Javascript_Node.js_Prototype - Fatal编程技术网

Javascript 为什么使用.call而不是直接向原型添加方法?

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实际上被添加到了东西的原型中?如果有人能解释的话,这部分对我来说有点模糊 此外,与

我正在使用一个Node.js插件,它实现了一个我想更好理解的模式

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实际上被添加到了东西的原型中?”是的,是的。