“新”如何在javascript中使用类?

时间:2016-10-27 05:11:50

标签: javascript

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  

3 个答案:

答案 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 syntax documentation

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.