Javascript 克罗克福德';有关构造函数调用模式的代码

Javascript 克罗克福德';有关构造函数调用模式的代码,javascript,function-prototypes,Javascript,Function Prototypes,下面的代码与Douglas Crockford的优秀著作JavaScript:The Good Parts(第29-30页)中的一些代码几乎相同。唯一的区别是他添加了get_status属性,如下所示: Quo.prototype.get_status=function() { this.status=string; } 我的问题是,为什么他的代码运行正常,但我下面的小改动会导致一个错误,即myQuo没有get_status方法 <script> var Quo=funct

下面的代码与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>

var Quo=函数(字符串){
this.status=string;
}
Quo.get_status=函数(){
返回此状态;
}
var myQuo=新的Quo(“困惑”);
警报(myQuo.get_status());

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

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

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

问题是为什么不将get_status添加到myQuo中。我已经知道我将它添加到了Quo,而不是它的原型中。实例不继承其构造函数的属性或方法-只有附加到原型的属性和方法才能被继承。