&引用;这";在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
设置为该新对象的构造函数。Soconsole.log(这个测试实例)构造函数内部的代码>表明这确实发生了。