&引用;这";在javascript函数中

&引用;这";在javascript函数中,javascript,Javascript,这是一个新手问题。我读过几篇类似的文章,但它们对我的帮助还不够。这篇文章有两个查询,但我把它们放在一起,因为它们的根看起来是一样的 我遇到了以下代码片段: var Server = module.exports.Server = function Server(listener) { if (!(this instanceof Server)) return new Server(listener); //other code } module.exports.createServer

这是一个新手问题。我读过几篇类似的文章,但它们对我的帮助还不够。这篇文章有两个查询,但我把它们放在一起,因为它们的根看起来是一样的

我遇到了以下代码片段:

var Server = module.exports.Server = function Server(listener) {
  if (!(this instanceof Server)) return new Server(listener);
  //other code
}

module.exports.createServer = function(listener) {
  return new Server(listener);
};
我无法理解if(!(服务器的这个实例))的用法何时不能指向此处的服务器

我尝试对此进行快速测试:

var createTest = function(){
    console.log(this.toString());
    return new Test();
};

var Test = function Test(){
    console.log(this instanceof Test);
    console.log(this.toString());
    if (!(this instanceof Test)) 
    {
        return new Test();
    }
}

var tester = createTest();
哪些产出:

[object global]
true
[object Object]
这让我更加困惑,为什么这个.toString会打印[object object]——它不应该是[object Test]吗


谢谢

该测试确保为以下两种用途创建新的服务器实例:

new module.exports.Server()
以及:

module.exports.Server()

在第二个例子中,
这个
指针将是全局对象,因此不会是测试的实例。在这种情况下,代码意识到构造函数只是在没有
new
的情况下直接调用的,因此没有创建新对象。由于这不是构造函数的预期用途,它通过调用一个
new
并返回结果来强制使用

这是一个用于使
new
可选的习惯用法。例如:

function TraditionalTest() {
}
function IdiomaticTest() {
    if(!(this instanceof IdiomaticTest)) return new IdiomaticTest();
}

console.log(new TraditionalTest());  // [object Object]
console.log(TraditionalTest());      // undefined
console.log(new IdiomaticTest());    // [object Object]
console.log(IdiomaticTest());        // [object Object]

至于为什么它是
[object object]
而不是
[object Test]
,我不知道为什么它是这样定义的,但是:

调用
toString
方法时,将执行以下步骤:

  • 如果
    值为
    未定义
    ,则返回“
    [对象未定义]
  • 如果
    值为
    ,则返回“
    [对象空]
  • 让O作为调用ToObject的结果,将
    值作为参数传递
  • 设class为O的[[class]]内部属性的值
  • 返回串接三个字符串“
    [object
    ”、class和“
    ]
    ”的结果字符串值
  • [[Class]]在规范中多次引用,但它只表示内置类型:

    • 参数
    • 数组
    • Boolean
    • 日期
    • 错误
    • 功能
    • JSON
    • 数学
    • 编号
    • 对象
    • RegExp
    • String

    我不确定,但可能是因为您在构造函数中,因此该类尚未被视为
    测试对象?猜猜看。你能解释一下我查询的第二部分吗?+1其中ES5在
    [[]]
    中使用了一个词(比如
    [[Prototype]]
    ),这意味着它是一种规范机制。实现的行为必须像支持它一样,但实际上并不一定要有它。因此,
    [[Class]]
    只是一种定义对象类的方法,而不指定它们实际上具有内部的、不可访问的类属性。他们只要表现得像他们那样就行了。请参阅第二部分,how is console.log(此测试实例);然后返回true?您正在使用
    returnnewtest()调用它
    创建一个新的
    Test
    对象,然后调用将
    this
    设置为该新对象的构造函数。So
    console.log(这个测试实例)表明这确实发生了。