关于如何在JavaScript中创建类的困惑

MBr*_*own 11 javascript class

过去在JavaScript中创建"类"时,我这样做了:

function Dog(name){
    this.name=name;
    this.sound = function(){
        return "Wuf";
    };
}
Run Code Online (Sandbox Code Playgroud)

但是,我只是看到有人这样做:

var Dog = (function () {
    function Dog(name) {
        this.name = name;
    }
    Dog.prototype.sound = function () {
        return "Wuf";
    };
    return Dog;
})();
Run Code Online (Sandbox Code Playgroud)

你可以两种方式做到,还是我做错了?在那种情况下,为什么?那两者在我们最终的结果方面究竟有什么区别?在这两种情况下,我们都可以创建一个对象:

var fido = new Dog("Fido");
fido.sound();
Run Code Online (Sandbox Code Playgroud)

我希望有人能开导我.

Mad*_*iha 15

你和他们的方式有两个重要的区别.

  1. 包装自调用函数((function() { ... })();)
  2. 使用.prototype属性over this.方法.

在自调用函数中包装事物,然后将结果(在return语句中定义为变量)分配给模块模式.这是确保范围更受控制的常见模式.

使用Dog.prototype.sound = function() {}优选this.sound = function().不同之处在于,Dog.prototype.sound使用Dog构造函数为所有对象定义了一次,并且为每个创建的Dog对象this.sound = function() {}再次定义了该属性.

经验法则是:定义对象的个体(通常是其属性)this,而对同一类型的所有对象(通常是函数)共享的东西将在原型上定义.