【问题标题】:Defining prototype methods inside the constructor在构造函数中定义原型方法
【发布时间】:2011-10-30 05:52:17
【问题描述】:

今天,我看到了我一生中从未见过的 JavaScript 模式。我无法说出使用这种模式的目的。这对我来说似乎是错误的,但我想保守一点。这可能是我以前从未见过的一些很棒的模式。

function Dog() {
    Dog.prototype.bark = function () {
        alert('woof!');
    }

    this.bark = function () {
        Dog.prototype.bark();
    }

    this.bark();
}

首先,我不喜欢无缘无故地在构造函数中创建方法(作为特权成员)。每次创建实例时都会导致创建函数。其次,在这段代码sn-p中,它也调用了原型名称“Dog”,而不是“this”。这让我非常困惑。

有人知道它有什么好处吗?

谢谢! 格蕾丝

【问题讨论】:

  • 这似乎毫无意义。据我所知,原型对象用于向定义之外的对象的所有实例添加属性。既然在定义中,就有点多余了。
  • 我完全同意你的看法。这对我来说似乎也毫无意义。

标签: javascript prototype-programming


【解决方案1】:

很抱歉,回复太晚了,但是如果您真的想在构造函数中添加原型并且在创建新实例时不重新创建它,您可以这样做:

function Dog() {
    if (!Dog.prototype.bark) {
        Dog.prototype = function() {
            console.log('woof');
        }
    }

    this.bark();
}

我仍然可能不会使用这种方法,但我有一些跨实例,在处理 3rd 方框架(狡猾的那种)时,这种方法是一种选择。

【讨论】:

    【解决方案2】:

    这是一个非常糟糕的主意,原因有很多。其中一些是:

    1. 在构造函数中向原型添加方法将导致原型方法被所有实例替换,每次实例化一个新的 Dog。
    2. 调用Dog.prototype.bark() 意味着this 将是Dog.prototype 而不是您的Dog 实例,这可能会导致严重问题。
    3. this.bark = function () { Dog.prototype.bark(); } 是一些严重的 WTF。因为this.bark 已经评估了原型方法,所以这没有必要。像这样调用它实际上会破坏自然的 this 值,如 #2 中所述。

    应该是这样的:

    function Dog() {
      this.makeSound();
    };
    
    Dog.prototype.bark = function() {
      alert('woof');
    };
    
    Dog.prototype.makeSound = function() {
      this.bark();
    };
    

    或者,完全没有原型:

    function Dog() {
      this.bark = function() {
        alert('woof');
      };
    
      this.makeSound = function() {
        this.bark();
      };
    
      this.makeSound();
    };
    

    我根本不会相信你这个sn-p。

    【讨论】:

    • #2:即使 bark 在构造函数之外初始化也是一样的——方法的 this 由调用设置。 #3:和#2一样(this将是Dog.prototype),但是函数不使用this所以它不会在这种情况下会导致问题。
    • 你为什么要this.makeSound = function() { }?如果没有澄清,这个例子可能会产生误导。这不会在原型对象上设置,并且对于new Dog(); 的每个实例,该函数都会在内存中复制。最好Dog.prototype.makeSound = function () {}
    猜你喜欢
    • 2015-10-16
    • 2020-07-11
    • 1970-01-01
    • 2017-11-10
    • 2015-10-10
    • 2012-01-22
    • 2011-05-29
    • 2023-03-28
    相关资源
    最近更新 更多