比较2个不同的Javascript构造方法

时间:2017-03-30 00:18:47

标签: javascript constructor

我是JavaScript的新手,发现下面的两种不同的方法能够实例化对象。

我查看了从两个构造函数创建的对象,它看起来与我相同。

但我不确定这两种方法有什么区别?在哪种情况下,方法比另一种更好?

任何人都可以解释一下吗?谢谢。

Person1.js

function Person1(name){
    this.name = name;
    this.initialize();
}

Person1.prototype.initialize = function (todoName) {
    console.log("Initalize function Person 1 class"+this);
    f1(this);
}

function f1(caller) {
    console.log("F1 Person 1 class"+this);
    console.log(this);
    console.log("F1 Person 1 class caller"+caller);
    console.log(caller);
}

Person2.js

var Person2 = (function(){

function Person2(name){
    this.name = name;
    this.initialize();
}

Person2.prototype.initialize = function (todoName) {
    console.log("Initalize function Person 2 class"+this);
    f1(this);
}

function f1(caller) {
    console.log("F1 Person 2 class"+this);
    console.log(this);
    console.log("F1 Person 2 class caller"+caller);
    console.log(caller);
}

return Person2;
})();

使用以下代码实例化对象:

var p1 = new Person1("P1");
var p2 = new Person2("P2");

console.log("Completed ");
console.log("P1 ");
console.log(p1);
console.log("P2 ");
console.log(p2);

1 个答案:

答案 0 :(得分:1)

Person2包含在所谓的立即调用的函数表达式(或IIFE)中。你会注意到它最后返回Person2,这就是为什么示例第一行的赋值有效。

您考虑使用此方法的原因是在IIFE中包装代码可以使全局范围保持干净(这意味着,例如,在浏览器中,window对象不会混淆一堆全球属性)。

作为初学者,我可能会选择Person1方法,因为它在视觉上更简单,更容易跟踪正在发生的事情。但是,随着您的进步,请牢记以上内容,并考虑哪些代码库的可维护性最佳。