我不熟悉JavaScript中的原型设计和构造函数。我看到有人用这种方式声明了一个构造函数:
var Person = (function(){
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.setName = function(name){ this.name = name; }
Person.prototype.setAge = function(age){ this.age = age }
return Person;
}());
这是正确的做法吗?
答案 0 :(得分:1)
是的,这是正确的形式,但不是唯一的形式。这相当于:
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.setName = function(name){ this.name = name; }
Person.prototype.setAge = function(age){ this.age = age }
您提供的代码将类声明包装在一个名称空间中,这是一种很好的做法。
答案 1 :(得分:1)
工作正常。该代码以这种方式声明构造函数,因为它希望使用定义实际构造函数的IIFE(立即调用函数表达式)将Person
的代码保存在其自己的“范围”或“命名空间”中。它的原型方法。
通常,要创建构造函数,只需:
new
运算符所以,真的,只是这样做:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.setName = function(name) { this.name = name; }
Person.prototype.setAge = function(age) { this.age = age; }
var me = new Person('Tom', 38);
就是你的例子所需要的一切。 IIFE作用域并返回构造函数只是为Person类型创建一种“模块”的一种方法。
答案 2 :(得分:1)
其他人没有提到的是,在你的IIFE中,所有功能都变成了闭包,你可以将它用于共享私人或受保护的成员。
Pseudo-classical inheritance with privacy?
由于你没有在样本中使用闭包变量,除非你出于美学原因喜欢它,否则将它包装在IIFE中是没用的。
有关原型的更多信息:Prototypical inheritance - writing up