我是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);
答案 0 :(得分:1)
Person2
包含在所谓的立即调用的函数表达式(或IIFE)中。你会注意到它最后返回Person2
,这就是为什么示例第一行的赋值有效。
您考虑使用此方法的原因是在IIFE中包装代码可以使全局范围保持干净(这意味着,例如,在浏览器中,window
对象不会混淆一堆全球属性)。
作为初学者,我可能会选择Person1
方法,因为它在视觉上更简单,更容易跟踪正在发生的事情。但是,随着您的进步,请牢记以上内容,并考虑哪些代码库的可维护性最佳。