在javascript中添加原型函数和对象文字之间的区别

时间:2013-12-21 23:12:25

标签: javascript prototype

如果我有构造函数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;
};

2 个答案:

答案 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"