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

标签 javascript class

过去在 JavaScript 中创建“类”时,我是这样做的:

function Dog(name){
    this.name=name;
    this.sound = function(){
        return "Wuf";
    };
}

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

var Dog = (function () {
    function Dog(name) {
        this.name = name;
    }
    Dog.prototype.sound = function () {
        return "Wuf";
    };
    return Dog;
})();

两种方法都可以吗,还是我做错了?在那种情况下,为什么?就我们最终得到的结果而言,两者之间到底有什么区别?在这两种情况下,我们都可以通过以下方式创建一个对象:

var fido = new Dog("Fido");
fido.sound();

希望有人赐教。

最佳答案

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

  1. 包装在一个自调用函数中 ((function() { ... })();)
  2. 对方法使用 .prototype 属性 this.

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

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

经验法则是:对于一个对象来说,独有的东西(通常是它的属性)要定义在 this 上,而对所有相同类型的对象(通常是函数)共享的东西) 将在原型(prototype)上定义。

关于javascript - 关于如何在 JavaScript 中创建类的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234385/

相关文章:

javascript - 使用填充方法创建二维数组

登录表单的 Javascript 验证 - 字段不得为空且包含 "\"

java - 两个构造函数调用之间的区别

java - 如何检查子对象是否来自特定类(而不是父类)(Java)

PHP - 使用字符串访问静态属性

c++ - 从具有不同子类的父指针调用子方法

javascript - 隐藏,显示使用 jquery

javascript - 在 Firebug 或 Chrome 中看不到 POST 操作

javascript - RxJS Observable 轮询直到条件为 true

Python 字符串到其他类