构造的用法是什么:function F() { if (!(this instanceof F)) { return new F() }; ... }
我在Node的pty.js中找到了这个。这是原始代码:
function Terminal(file, args, opt) {
if (!(this instanceof Terminal)) {
return new Terminal(file, args, opt);
}
var self = this
, env
, cwd
, name
, cols
, rows
, term;
-------------------SKIP-----------------------------------
Terminal.total++;
this.socket.on('close', function() {
Terminal.total--;
self._close();
self.emit('exit', null);
});
env = null;
}发布于 2014-03-05 23:37:56
这意味着,如果函数是在没有new操作符的情况下调用的,它将自动返回一个新实例。
举个例子,如果你没有这个安全措施,而且做了这个.
var t = Terminal();在执行...then this时,Terminal()会指向window (或者您的全局对象,高级的非浏览器人员/gal),绝对不是您想要的。
通过确定this实际上是Terminal的一个实例,我们就可以继续。否则,安全措施将返回一个新对象。
然后我们可以简单地使用这两种形式..。
var t = Terminal(); // Will be same as `new Terminal()`发布于 2014-03-05 23:38:47
这只是为了确保它能够工作,即使F是在没有new的情况下调用的。
当您使用F调用new时,在该函数中,this是新实例。
然后,如果this不是F (!(this instanceof F))的实例,那就意味着F不是使用new调用的。在这种情况下,F调用自己,现在使用new。
发布于 2015-09-08 16:59:07
除了这篇文章中的伟大解释之外,我们还可以看到引擎盖下发生了什么。ECMAScript规范( Javascript所基于的) 定义是一个全局对象。这在不同的执行环境中有不同的实现。在典型的浏览器中,它是window对象,而在Node.js中是root对象。每个定义为“在野外”的函数(没有附加到用户创建的对象)都将成为全局对象的属性。在Node.js中,您可以尝试:
> function Test() {};
> root.Test
[Function: Test]现在,this变量指向函数是成员的对象。所以在上面的例子中:
> function Test() {
... console.log(this === root);
... };
> Test()
true您的函数Terminal也是如此。如果您运行它,this将指向全局对象,这当然不是-- Terminal的一个实例!
当使用new运算符调用函数时,将返回一个对象,该对象将访问一个名为constructor的属性,该属性将指向该函数。它相当于:
> var instance = {};
> instance.constructor = Terminal;
> instance.constructor();因此,当条件失败并通过new Terminal()行运行终端函数时,this将指向一个新创建的实例,其中是类型为的终端!
如果您想获得更多的技术知识,instance本身就没有constructor属性。相反,它(通过prototype链*)链接到一个私有对象**(由运行时创建),该对象具有指向终端函数的constructor属性。通过函数通过属性将该私有对象指向。D.Crockford用伪码表示这一点,如下所示:
Terminal.prototype = {constructor: Terminal};同样,当您使用调用函数时,这是。
*如果找不到属性,则对象将查找__proto__属性指向的对象。
** (想象一下一个名为_Terminal的对象,您不能按名称访问它)
https://stackoverflow.com/questions/22211755
复制相似问题