如果我有构造函数Quo
var Quo = function (string) {
this.status = string;
};
然后使用var myQuo = new Quo("confused");
之间的区别是什么:
Quo.get_status = function () {
return this.status;
};
和
Quo.prototype.get_status = function () {
return this.status;
};
答案 0 :(得分:16)
假设您已创建了myQuo
,正如您所描述的那样
var myQuo = new Quo("confused");
如果您将get_status
定义为Quo
的属性,那么要获得myQuo
的状态,您必须致电Quo.get_status
。但是,Quo.get_status
需要知道对象上下文(myQuo)才能返回正确的status值。您可以重新定义函数以接受对象作为参数,如下所示:
Quo.get_status = function (quo) {
return quo.status;
};
var status = Quo.get_status(myQuo);
或者,您可以在问题中保留函数Quo.get_status
,但是您需要以将myQuo
绑定到“this”的方式调用函数:
Quo.get_status = function() {
return this.status;
};
var status = Quo.get_status.call(myQuo);
任何一种解决方案都很尴尬。首选解决方案是利用Javascript的原型功能,并将get_status
定义为原型函数,所有Quo
个对象都可以在本地访问,例如myQuo
。
Quo.prototype.get_status = function () {
return this.status;
};
var status = myQuo.get_status();
答案 1 :(得分:15)
定义函数时,它具有属性prototype
,该属性用作使用[[prototype]]
关键字创建的所有对象的new
。当您向Quo.prototype
添加成员时,使用new Quo()
创建的所有对象都能够像使用[[prototype]]
一样(即Quo.prototype
)来阅读该成员。另一方面,如果您直接将成员分配到Quo
,则只能通过Quo
本身访问这些成员。
示例:
var Quo = function (status) {
this.status = status;
}
Quo.status = "enlightened";
Quo.get_status = function() {
return this.status;
}
Quo.prototype.get_status = function() {
return this.status;
}
var quo = new Quo("confused");
Quo.get_status(); // "enlightened"
quo.get_status(); // "confused"