【问题标题】:Javascript inheritance patternJavascript继承模式
【发布时间】:2017-03-09 04:36:44
【问题描述】:

我正在用 Javascript 编写域对象,其中填充了数据库字段。假设我有两个对象dogcat,并且我有以下构造函数定义:

function Dog(opt_data) {
  var data = opt_data || {};

  this.createdAt = data['created_at'];
  this.updatedAt = data['updated_at'];
  this.name  = data['name'];
  this.breed = data['breed'];
}


function Cat(opt_data) {
  var data = opt_data || {};

  this.createdAt = data['created_at'];
  this.updatedAt = data['updated_at'];
  this.name = data['name'];
  this.fur  = data['fur'];
}

现在,以上两个对象都有craetedAtupdatedAt 属性。那么,我应该创建一个新类BaseModel,它具有属性并让所有对象都继承它,还是在javascript中有更好的替代方案来实现这种模式?

更新 1:

我的理解来自cmets和答案。

function Cat(opt_data) {
  var data = opt_data || {};


  this.name = data['name'];
  this.fur  = data['fur'];

  this.updateTimestamp(data);
}
Cat.prototype = Object.create({
  updateTimestamp: function(data) {
    this.createdAt = data['created_at'] || new Date();
    this.updatedAt = data['updated_at'] || new Date();
  }
});

【问题讨论】:

  • both of the above objects have craetedAt and updatedAt properties 不在您发布的代码中。
  • 除非你发现你需要别的东西,否则去简单的鸭子打字。
  • @Bergi 你能举个例子吗?
  • @CodeYogi 你已经做了,你的代码很好。如果您不这么认为,请告诉我们您需要如何处理您的实例。
  • @Bergi 您可以看到我有一组通用属性,这些属性将出现在我创建的每个对象上,您不认为这是重复代码并且容易出错吗?

标签: javascript object design-patterns


【解决方案1】:

除非createdAtupdatedAt 值具有一些您需要在DogCat 对象上定义的通用支持方法或访问器,否则只需将属性设置为您需要的任何值。

由于您没有在 JavaScript 中声明对象成员(就像在 C++、C#、Java 等中那样),在您提出的情况下,从 BaseModel 原型继承没有任何好处。也就是说,由于您不必在 JavaScript 中执行任何操作来创建 createdAtupdatedAt 属性,而只需简单地分配给它们,因此基类型并没有真正提供任何有用的东西,因为您只需要无论如何都要在基类型构造函数中分配这些属性。

如果两个对象都需要具有相似的方法来保存和加载数据(大概是在保存时自动更新updatedAt 属性),您可能需要一个基本类型。在这种情况下,给DogCat 提供一个带有保存和加载方法的原型将是原型继承模式的有用应用。

【讨论】:

  • 如果有更多具有相同属性的对象,你不觉得我们会写重复的代码吗?
  • @vivek 这将是一个帮助函数设置现有对象属性的情况。原型继承模型对这种特定情况没有任何用处。
  • @cdhowie 坦率地说我仍然无法理解这一点,也许我无法摆脱经典的继承模式。
  • @CodeYogi 对于许多尝试学习 JavaScript 的开发人员来说,这是一个绊脚石。您可能会挂断的部分是,在许多具有经典继承的语言中,您必须在类上声明每个属性。 JavaScript 根本没有类,它只有对象。 您不必声明属性存在,您只需分配给它, 当您这样做时,它应运而生。
  • @cdhowie 我不记得了,但我在某处读过在构造函数中定义属性会优化代码。
猜你喜欢
  • 2013-10-31
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2018-01-24
  • 2016-05-23
  • 2014-05-17
  • 2013-04-28
相关资源
最近更新 更多