声明构造函数的好处/缺点

时间:2014-05-04 13:07:05

标签: javascript

我不熟悉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;
}());

这是正确的做法吗?

3 个答案:

答案 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的代码保存在其自己的“范围”或“命名空间”中。它的原型方法。

通常,要创建构造函数,只需:

  1. 功能
  2. 在用作构造函数的函数内部,使用'this'修改正在创建的对象
  3. 使用new运算符
  4. 调用该函数

    所以,真的,只是这样做:

    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