【问题标题】:Crockford's code concerning the Constructor Invocation PatternCrockford 的关于构造函数调用模式的代码
【发布时间】:2012-07-26 04:43:14
【问题描述】:

下面的代码几乎与 Douglas Crockford 的名著 JavaScript:The Good Parts(第 29-30 页)中的一些代码相同。唯一的区别是他像这样添加了 get_status 属性:

Quo.prototype.get_status=function() {
  this.status=string;
}

我的问题是为什么他的代码运行正常,但我在下面的一点点改动导致了一个错误,提示 myQuo 没有 get_status 方法?

<script>
  var Quo=function(string) {
    this.status=string;
  }
  Quo.get_status=function() {
    return this.status;
  }
  var myQuo=new Quo("confused");
  alert(myQuo.get_status());
</script>

【问题讨论】:

    标签: javascript function-prototypes


    【解决方案1】:

    您将方法添加到Quo 函数对象,而不是它的原型,因此它不会被使用new Quo() 创建的实例继承。以这种方式添加的函数有点像经典 OOP 语言中的静态方法——它可以用Quo.get_status() 调用,但它不会被实例继承,this 将引用Quo 函数本身。

    Quo.status = "foo";
    Quo.get_status(); // "foo"
    

    【讨论】:

    • 问题是为什么 get_status 没有添加到myQuo。我已经知道我将它添加到 Quo,而不是它的原型。
    • 实例不继承其构造函数的属性或方法——只有附加到原型的属性和方法被继承。
    【解决方案2】:

    函数是 JavaScript 中的对象。当您向函数添加属性时,它们不会被该函数的实例继承。但是,当您将属性添加到函数的原型时,它们就会被继承。要了解基于原型的继承如何在 JavaScript 中工作,请阅读 following answer

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2016-06-07
      相关资源
      最近更新 更多