【问题标题】:Is it good practice to extend a class by using a method?使用方法扩展类是一种好习惯吗?
【发布时间】:2017-06-14 18:14:08
【问题描述】:

我见过this 的问题,我知道如何扩展一个类。但是,用方法做到这一点是一种好习惯吗?使用它是否安全:

function extendClass(child, parent) {
    child.prototype = Object.create(parent.prototype);
    child.constructor = child;
}

extendClass(Banana, Fruit);

而不是这个:

Banana.prototype = Object.create(Fruit.prototype);
Banana.prototype.constructor = Banana;

【问题讨论】:

  • 我认为它们是一样的。第一个更灵活,以防您必须扩展很多类(因此您不会为每个类编写这两行代码)

标签: javascript class oop extending-classes


【解决方案1】:

使用函数来执行重复的工作,而不是在需要做的任何地方重复工作是标准做法。它可以减少出错的机会并集中操作,以防它需要随着时间的推移而增强。在继承关系中连接构造函数和相关原型(“类”)并没有什么特别之处,这使它成为例外。


与切线相关的旁注:从 ES2015(又名“ES6”,2015 年 6 月发布的规范)开始,这种设置这些层次结构的方式已经过时(当然它仍然有效)。 ES2015+的方式是classextends

【讨论】:

  • 是否也可以调用extendClass(Banana, Fruit) 之前 我声明了实际的Banana 函数?声明应该被吊在上面,一切都会好起来的,对吧?
  • @HristiyanDodov:如果它是函数声明而不是函数表达式,它会起作用,是的,因为(如你所说)提升。当然,您是否想按照风格来做这件事取决于您。
  • CF。 “这种设置这些层次结构的方式已经过时了”。唯一被认为过时的是用于设置这些层次结构的语法。 ES2015 的“方式”完全一样,同时隐藏了类的真实性质、原型,并添加了一些额外的陷阱(例如,没有真正的私有方法或属性)。
  • @Tyblitz:不,不完全一样;新语法可以做旧语法不能做的事情(比如子类 Error 和 Array)。我不认为它隐藏任何东西,但无论如何。当然不会影响你可以做的事情来使事情变得私密;相同的技术继续适用。
  • @TJCrowder 可以用新语法完成的所有事情都可以用 ES5 完成,但反之亦然(例如,class 构造函数不能与 .call.apply 一起使用) .我把它留在那里,如果你真的认为它没有隐藏任何东西,Eric Elliott 有一个good series about all the pitfalls of ES6 classes
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多