首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript寄生继承、闭包

Javascript寄生继承、闭包
EN

Stack Overflow用户
提问于 2020-09-03 04:21:42
回答 1查看 49关注 0票数 0

我正在尝试理解闭包中的JavaScript寄生行为。

谁能告诉我为什么我们需要在Teacher函数构造函数中返回一个自变量?

代码语言:javascript
复制
 function Person(name, age) {
  return {
    getName: function() {
      return name;
    },
    getAge: function() {
      return age;
   },
 };
}

function Teacher(name, age, subject) {
  let self = Person(name, age);
  self.teach = function() {
    return `${name} is teaching ${subject}.`;
  };
  return self;
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-03 04:43:23

在您选择的寄生模式中,return是必需的,否则执行new Teacher将返回一个相当空的Teacher实例(即this)。在这种模式下,您选择避免使用this,这实际上是JavaScript在您使用new时为您准备的对象。

如果选择在JavaScript中使用寄生继承模式,则归结为忽略new和避免this,并显式创建父对象(这里称为self )、扩展它并返回它。

请注意,您可以使用Object.assign在"one“go中执行所有三个步骤,这允许您使用与Person中类似的对象文字语法

代码语言:javascript
复制
function Person(name, age) {
  return {
    getName: function() {
      return name;
    },
    getAge: function() {
      return age;
   },
 };
}

function Teacher(name, age, subject) {
  return Object.assign(Person(name, age), {
    teach() {
      return `${name} is teaching ${subject}.`;
    }
  });
}

这种模式的缺点是,每次构造对象时,都会为getAgegetNameteach创建新的函数对象。这是一种遗憾。原型继承提供的方法只存在一次,并且可以在不同的对象实例上调用(使用this-binding工具)。最重要的是,它允许您使用instanceof检查对象的“类型”。

尽管对于哪种模式比其他模式更好会有不同的看法,但很明显,通过寄生继承,您正在与标准的原型继承模式作斗争,该模式也随着class语法的引入而得到了改进。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63713031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档