Javascript方法链接定义

时间:2015-02-12 14:03:02

标签: javascript prototype

在Javascript中使用方法链接时有什么区别 我知道这可能有一些奇怪的怪癖,所以我不确定:

var Kitten = function() {
  this.name = 'Garfield';
  this.color = 'brown';
  this.gender = 'male';
};

Kitten.prototype.setName = function(name) {
  this.name = name;
  return this;
};

Kitten.prototype.setColor = function(color) {
  this.color = color;
  return this;
};

var obj = new Kitten().setName("tom").setColor("red");

var Kitten = function() {
  this.name = 'Garfield';
  this.color = 'brown';
  this.gender = 'male';
  this.setColor = function(color) {
     this.color = color;
     return this;
  };
  this.setName = function(name) {
     this.name = name;
     return this;
  };

};

var obj = new Kitten().setName("tom").setColor("red");

2 个答案:

答案 0 :(得分:4)

调用代码的结果是相同的,实现之间的区别是:

如果在实例化函数中调用了函数,则每次创建new对象时都会创建它们。当它们在原型上创建时,那些函数在所有实例之间共享。

两者都有优点和缺点 - 您可以使用内部函数来创建类似于其他语言中可能会看到的“私有”成员变量,以及实现JavaScript开发人员广泛使用的Module模式,但是如果您打算创建大量对象然后拥有共享原型函数可以提高内存效率。人们现在对记忆效率并没有太多考虑,但如果你的目标是移动平台,那么它就是相关的。

我更喜欢使用原型,因为我觉得它对语言的流动更加自然,但是 - 就像所有严肃的JavaScript开发一样 - 它确实意味着有时你最终会遇到令人困惑的范围场景。

答案 1 :(得分:1)

没有区别。

在对象中使用this时,您将值放入对象中。

您自动将名称属性添加到Kitten对象中:

var Kitten = function() {
    this.name = 'Garfield';
}

您从外部明确地将名称添加到Kitten原型中:

 var Kitten = function() {
 }

 Kitten.prototype.name = "Garfield";

当您使用new Kitten()时,对象之间共享原型,并且将重新创建在this的函数内创建的内容。