哪个是更好的Javascript对象模式

时间:2011-08-22 04:02:18

标签: javascript object

哪个是更好的Javascript对象模式...

function dog(name) {
  this.name = name;
  this.getName = function() {
    return this.name;
  };
};

OR

function cat(name) {
  this.name = name;
};
cat.prototype.getName = function() {
  return this.name;
};

为什么?

-----编辑

是否有人使用更多内存?

一个或多或少的“CPU”比另一个更强?

哪个更易于维护?

哪个更具可扩展性?

哪个更具可读性?

5 个答案:

答案 0 :(得分:7)

抛开偏好,第二个例子是“正确的”。在第一个中,您将为每个对象创建一个新的getName函数。在2中,使用此构造函数创建的所有对象将共享原型/ getName。在一个地方更改它,它将针对每个实例进行更改。

在特殊场合(如复杂的继承链),您可能需要使用第一个,但要注意它的缺点。

This blog post可能会帮助您更好地理解原型继承。

答案 1 :(得分:2)

这里只是个人意见......但我更喜欢长期可维护性的“狗”式符号。

所有“狗”代码都包含在狗定义中。想象一下,5年后,“下一个人”被指示删除hasTail属性。无论有多少其他对象/属性/等。从现在到现在都定义了,他会在狗的定义中找到它。

为了进行比较...想象一下5年后,“下一个人”被指示从“cat”中删除hasTail属性。他必须扫描/ grep / ctl + f来自animals.js文件的hasTail,并希望他删除正确的。

答案 2 :(得分:1)

我个人更喜欢在对象中包装函数定义(例如狗符号),因为它更像是Java / PHP“类”。 但是,使用dog表示法会降低内存效率,因为每次创建新实例时都会复制函数(请参阅此article

答案 3 :(得分:0)

我使用cat表示法,因为它不会引入不必要的闭包,这可能效率不高。

但是,我从来没有测试过 它们的效率如何,而且在这个超优化JavaScript引擎时代,它可能没有那么大的差别。

答案 4 :(得分:0)

我更喜欢使用原型的cat方法。

  1. 我宁愿不让我的所有方法在构造函数中再缩进一层。
  2. 我宁愿让构造函数代码只是构造函数代码而不是许多其他函数 - 我认为这样可以更容易地看到你在寻找什么。
  3. 我宁愿使用原型,因此每次运行构造函数时都不必分配所有方法。
  4. 在我看来,这就是整个原型存在的原因,所以你可以把它放在未来的实例化将自动继承而不必运行代码来分配它们。
  5. 此外,如果您想要混合使用,您可以从原型中获取所有方法,而无需构建其中一个对象。
  6. 当你开始进行子类化时,我发现原型方案更容易理解。
  7. 我发现搜索方法定义更容易,因为它们都包含.prototype.