function hasNull(obj) {
let result = false;
JSON.stringify(obj, (_, v) => v === null || v === undefined ? result = true : v);
return result;
}
在以下2个示例中的工作方式有何不同?我看到第二个例子是用变量替换烦人的函数,但在第二个例子中,实际上正在调用函数/类“Person”。它是否被调用会有什么不同吗?我在没有电话的情况下尝试了它,它仍然有用。所以这让我相信new实际上正在调用函数并设置new
来分配给实例变量。
this
var person = new function() {
this.setName = function(name) {
this.name = name;
}
this.sayHi = function() {
return "Hi, my name is " + this.name;
}
}
person.setName("Rafael");
console.log(person.sayHi()); // Hi, my name is Rafael
答案 0 :(得分:2)
这两个例子之间几乎没有区别,如果它是一个像这样的简单函数:
(function() { console.log("IIFE"); })();
// or
var f = function() { console.log("Function"); };
f();
您只需将函数存储在变量中,然后调用它。
然而,它有一点不同,因为它与JS OOP机制有关。在第一种情况下,您获得Object
实例,在第二种情况下,您获得Person
实例。这在OOP意义上有所不同。
var person = new function() { };
console.log("Is instance of: " + person.constructor.name);
console.log("There is no way to check instanceof in this case");
var Person = function() { };
var person = new Person();
console.log("Is instance of: " + person.constructor.name);
console.log(person instanceof Person);
通常,new
和类应该像第二种情况一样使用,以便启用JS OOP的全部功能。使用匿名类构造函数绝对没有任何意义和/或优势。
答案 1 :(得分:1)
是否将其分配到变量:无关紧要。它与此示例完全平行:
var x = 1;
console.log(x);
和
console.log(1);
是否需要调用:始终调用具有new
运算符的函数,但使用new
时,如果没有传递参数,则括号是可选的:new Person()
是等同于new Person
,但new Person("Joe")
不能以不同方式完成。
答案 2 :(得分:1)
在第二个示例中,您将向 new 运算符传递完全相同的函数。您只是使用引用(逻辑上存储在变量中)而不是恰好编写文字函数。
所以,你的第二个例子是相同的:
var personTwo = new (function() {
[...]
})()
[...]
事实上,与第一个问题大致相同:
var person = new (function() {
[...]
})
[...]
注意在这种情况下,函数周围的括号绝对是可选的。如果您愿意,可以将其放在那里:
(((((((function(){[...]})))))))
。
这里的要点是,当你在第二个中说«时,实际上正在调用函数/类“Person”» 你在那里错了:那个函数,作为构造函数的行为不是被称为。您只是将它作为 new 运算符的参数(构造函数)传递,实际上,实际上,谁正在使用您提供的其余参数调用构造函数(如果有的话)。
new constructor[([arguments])]
构造函数是传递给new运算符的函数,参数在括号之间指定。但它们是完全可选的(包括括号本身)。
这就是new constructor;
没有括号的原因。
要明确:您认为发生的事情(但不是)将写成:
var person = new ((function(){...})()) ();
...或者,更详细地说:
var person = new (
(function(){ // Constructor builder.
[...]
return function(){...}; // Actual constructor.
})() // Constructor builder call
//v-- Parentheses to force builder to be called.
) (); // <-- Parameters (if any) passed to the constructor.