首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数F() { if (!(此实例F)) {返回新F() };.}

函数F() { if (!(此实例F)) {返回新F() };.}
EN

Stack Overflow用户
提问于 2014-03-05 23:36:51
回答 3查看 5.7K关注 0票数 39

构造的用法是什么:function F() { if (!(this instanceof F)) { return new F() }; ... }

我在Node的pty.js中找到了这个。这是原始代码:

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-05 23:37:56

这意味着,如果函数是在没有new操作符的情况下调用的,它将自动返回一个新实例。

举个例子,如果你没有这个安全措施,而且做了这个.

代码语言:javascript
复制
var t = Terminal();

在执行...then this时,Terminal()会指向window (或者您的全局对象,高级的非浏览器人员/gal),绝对不是您想要的。

通过确定this实际上是Terminal的一个实例,我们就可以继续。否则,安全措施将返回一个新对象。

然后我们可以简单地使用这两种形式..。

代码语言:javascript
复制
var t = Terminal(); // Will be same as `new Terminal()`
票数 46
EN

Stack Overflow用户

发布于 2014-03-05 23:38:47

这只是为了确保它能够工作,即使F是在没有new的情况下调用的。

当您使用F调用new时,在该函数中,this是新实例。

然后,如果this不是F (!(this instanceof F))的实例,那就意味着F不是使用new调用的。在这种情况下,F调用自己,现在使用new

票数 12
EN

Stack Overflow用户

发布于 2015-09-08 16:59:07

除了这篇文章中的伟大解释之外,我们还可以看到引擎盖下发生了什么。ECMAScript规范( Javascript所基于的) 定义是一个全局对象。这在不同的执行环境中有不同的实现。在典型的浏览器中,它是window对象,而在Node.js中是root对象。每个定义为“在野外”的函数(没有附加到用户创建的对象)都将成为全局对象的属性。在Node.js中,您可以尝试:

代码语言:javascript
复制
> function Test() {};
> root.Test
[Function: Test]

现在,this变量指向函数是成员的对象。所以在上面的例子中:

代码语言:javascript
复制
> function Test() { 
... console.log(this === root); 
... };
> Test()
true

您的函数Terminal也是如此。如果您运行它,this将指向全局对象,这当然不是-- Terminal的一个实例!

当使用new运算符调用函数时,将返回一个对象,该对象将访问一个名为constructor的属性,该属性将指向该函数。它相当于:

代码语言:javascript
复制
> var instance = {};
> instance.constructor = Terminal;
> instance.constructor();

因此,当条件失败并通过new Terminal()行运行终端函数时,this将指向一个新创建的实例,其中是类型为的终端!

如果您想获得更多的技术知识,instance本身就没有constructor属性。相反,它(通过prototype链*)链接到一个私有对象**(由运行时创建),该对象具有指向终端函数的constructor属性。通过函数通过属性将该私有对象指向D.Crockford用伪码表示这一点,如下所示:

代码语言:javascript
复制
Terminal.prototype = {constructor: Terminal};

同样,当您使用调用函数时,这是

*如果找不到属性,则对象将查找__proto__属性指向的对象。

** (想象一下一个名为_Terminal的对象,您不能按名称访问它)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22211755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档