在Javascript中使用或不过度使用原型的最佳实践

在Javascript中使用或不过度使用原型的最佳实践,javascript,Javascript,我不认为开发者喜欢在JS中使用原型,除非应用程序的规模很大。这是因为他们避免了原型功能的过度使用 有没有比逻辑更简单的写作方法 function Dog (breed) { this.breed = breed; }; Dog.prototype.bark = function() { console.log("Woof"); }; var buddy = new Dog("golden Retriever"); buddy.bark(); var snoopy = new Dog

我不认为开发者喜欢在JS中使用原型,除非应用程序的规模很大。这是因为他们避免了原型功能的过度使用

有没有比逻辑更简单的写作方法

function Dog (breed) {
  this.breed = breed;
};

Dog.prototype.bark = function() {
  console.log("Woof");
};

var buddy = new Dog("golden Retriever");
buddy.bark();

var snoopy = new Dog("Beagle");
snoopy.bark();

此模式的优点是提供隐私。

方法1

function Dog (breed) {
  this.breed = breed;
};

Dog.prototype.bark = function() {
  console.log("Woof");
};
优势:

  • 如果创建更多的
    对象,则创建对象的速度会更快,因为
    吠叫
    已在原型中定义,它也将在新对象中设置
  • 缺点:

  • 它无法保护数据成员。由于函数是与其他数据成员分开定义的,因此它不能在闭包范围内
  • 方法2

    function Dog (breed) {
      this.breed = breed;
      this.bark = function() {
         console.log(this.breed);
      };
    };
    
    缺点:

  • 每次创建对象时,都必须创建函数。因此,性能开销
  • 因为,
    breed
    直接添加到对象本身,所以可以通过对象访问它。因此,没有数据保护
  • 方法3

    function Dog (breed) {
      this.bark = function() {
         console.log(breed);
      };
    };
    
    优势

  • 借助闭包,您可以在对象内访问
    breed
    ,但不能在对象外访问。因此,保护数据
  • 无额外变量:)
  • 缺点:

  • 每次创建对象时,都必须创建函数。因此,性能开销

  • 你想在这里实现什么?@qantas941使用prototype重写上述代码的更简单方法,当我将dog.prototype.bark放入dog构造函数中时,它可以工作,你知道为什么吗?你的实现很好;最好将共享方法放在原型上,而不是实例上。@elclanrs放在构造函数中不合适吗?但是为什么它能工作并且有相同的结果呢?因为当你向构造函数添加一个函数时,你会将它分别附加到每个实例上。当您将其添加到原型中时,您将与所有实例共享该方法。它不保护树皮,但
    繁殖
    ,但为什么要使用
    ?为什么不创建一个新的变量?@theforutheye不是我说的吗?“这种模式的优点是它提供了隐私。”缺点是增加了内存使用量,
    instanceof
    不起作用,深度复制这样的对象不起作用,可能还有更多的事情。为什么要创建一个变量呢?如果要使用闭包,则引用闭包时会捕获
    breed
    作为参数。
    function Dog (breed) {
      this.bark = function() {
         console.log(breed);
      };
    };