ES6 类执行多态性的能力

2024-02-01

我试图通过 ES6 类来模拟多态性,以便能够更好地理解这个理论。

概念很清楚(设计对象以共享行为并能够用特定行为覆盖共享行为)但恐怕我上面的代码不是一个有效的多态性示例。

由于我缺乏经验,如果您能全面地回答以下问题,我将不胜感激:

  • 事实上,两个类都有一个同样命名的方法,并且每个类创建的实例都可以正确访问它们各自的方法,这使得这是一个多态示例吗?
  • 如果这不能模拟多态性,应该进行哪些更改 在代码中做了什么?
  • 我试过删除Employee.prototype = new Person();线,它仍然有效。这就是为什么我担心我不明白这个概念。
class Person {
  constructor (name, age) {
    this._name = name;
    this._age = age;
  }
}

Person.prototype.showInfo = function(){
  return "Im " + this._name + ", aged " + this._age;
};


class Employee {
  constructor (name, age, sex) {
    this._name = name;
    this._age = age;
    this._sex = sex;
  }
}

Employee.prototype = new Person();

Employee.prototype.showInfo = function(){
  return "Im " + this._sex + ", named " + this._name + ", aged " + this._age;
};


var myPerson = new Person('Jon', 20);
var myEmployee = new Employee('Doe', 10, 'men');

document.write(myPerson.showInfo() + "<br><br>");   // Im Jon, aged 20
document.write(myEmployee.showInfo() + "<br><br>"); // Im men, named Doe, aged 10

每个 JavaScript 对象都有一个内部“prototype”属性,通常称为 [[prototype]],它指向它直接继承的对象。

每个 JavaScript 函数[对象]都有一个属性原型,它是用一个[几乎]空的对象初始化的。当您通过将其作为构造函数调用来创建该函数的新实例时,该新对象的 [[prototype]] 将指向构造函数的原型对象。

所以,当你写这个的时候var myPerson = new Person('Jon', 20);,你有方法 showInfo 因为你有这个

Person.prototype.showInfo = function(){
    return "Im " + this._name + ", aged " + this._age;
};

使用 ES6,如果你想查看多态性,你可以这样做:

class Person {
    constructor (name, age) {
        this._name = name;
        this._age = age;
    }
        
    showInfo () {
        return "Im " + this._name + ", aged " + this._age;
    }
}

class Employee extends Person {
    constructor (name, age, sex) {
        super(name,age);
        this._sex = sex;
    }
        
    showInfo(){
        return "Im " + this._sex + ", named " + this._name + ", aged " + this._age;
    }
}

var myPerson = new Person('Jon', 20);
var myEmployee = new Employee('Doe', 10, 'men');

document.write(myPerson.showInfo() + "<br><br>");   // Im Jon, aged 20
document.write(myEmployee.showInfo() + "<br><br>"); // Im men, named Doe, aged 10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 类执行多态性的能力 的相关文章

随机推荐

  • 如何设置条件编译变量?

    在 C C 中 您可以在代码中定义宏 如下所示 define OLD WAY 1 尽管我从未这样做过 但我认为 C 中也可以实现同样的功能 更重要的是 在 C C 中 可以通过执行以下操作来执行一些条件编译逻辑 if OLD WAY 1 i
  • 多个 svn 项目合并到一个 git 存储库中?

    我已经开始使用 git svn 来完成我的一些工作 以便能够进行本地提交 这对于使用标准 svn 布局的项目非常有用 最近 我开始开发一个 Java 项目 该项目分为多个连接的模块 20 25 每个模块在同一个 svn 存储库中都有自己的根
  • 我怎样才能让 Decimal.TryParse 解析 0.0?

    有没有办法让 Decimal TryParse 将字符串值 0 0 或 00 00 或 000 000 解析为 0 我尝试将 NumberStyles 设置为 Any 使用 InvariantCulture decimal TryParse
  • 如何忽略 Subclipse 中的构建目录?

    构建后 我在自动生成的构建目录中得到了大量的类文件 我不想提交它们 所以我尝试使用忽略它们Team gt Add to svn ignore 但它们已经变灰了 我尝试删除构建目录Project gt Clean 但有趣的是 当我尝试提交时
  • new String(char[]) 和 char[].toString 之间的区别

    Java 中以下两个代码块的输出是不同的 我试图理解为什么 private String sortChars String s char arr s toCharArray creating new char Arrays sort arr
  • Resteasy一般启用GZIP

    我有一个 RestEasy Java EE 应用程序 当我将 GZIP 添加到组件类时 如果客户端发送 accepts gzip 则服务器答案将被压缩 有没有办法为所有组件普遍启用 gzip 我不喜欢为每个类添加注释 我正在使用 RestE
  • 十六进制增量/循环直到 FFF

    我有一个包含十六进制数字的字符串 我想增加该十六进制数字 直到达到最大数字 FFF 我如何循环才能获得起始十六进制和 FFF 之间的每个数字 我尝试将字符串转换为字节数组 但之后陷入困境 string stringHex 7A string
  • 使用 BigQuery 获取 Firebase Analytics 历史数据

    我已将 firebase 分析应用程序链接到 BigQuery 并在 app events 和 app events intraday 表下获取原始数据 使用 BigQuery 的主要要求是获取在 Firebase 分析仪表板下获得的分析数
  • 如何将Gitlab项目复制到另一个Gitlab存储库?

    我想将 GitLab 项目复制到另一个存储库 该存储库应该是完全独立来自原始项目 为此 我尝试将原来的项目fork到另一个项目中 但在原始项目中 维护者仍然可以看到分叉列表 并知道其他分叉的维护位置 我想要一个完整的副本 没有任何到主项目的
  • WinSCP .NET 程序集拒绝 RSA/DSA 密钥指纹

    我正在尝试使用 WinSCP NET 程序集连接到 WinSCP 服务器 我遇到的问题是它会轰炸检查主机密钥指纹 我已经创建了 RSA 密钥 我的代码如下 var server new WinSCP SessionOptions serve
  • 将某些指标与 Google Analytics API v4 中的会话和产品相关联

    我在 GA api 中需要获取一些非常具体类型的指标 站点级别 使用购物车进行的站点访问添加 这是会话次数的计数 发生在会话中发生购物车添加的时间范围内 产品视图的站点访问 这是对在会话中出现产品详细信息视图的时间范围内发生的会话数量的计数
  • 材质按钮在预览中未正确显示

    这个问题与我的另一个问题相关 材质按钮 样式应用不正确 丑陋极了 https stackoverflow com questions 53224903 material button styles not being applied cor
  • TFS 2010:当我可以使用 XamlReader 进行反序列化时,为什么无法使用 XamlWriter.Save 反序列化 Dictionary

    public static string GetXml Dictionary
  • Python ctypes 可以在 x86-64 上加载 32 位 C 库吗?

    我有一台安装了 32 位库的 64 位 RHEL 主机 一个供应商有 32 位 所以我想使用 ctypes 加载到 Python 中 from ctypes import CDLL CDLL 32bitdinosaur so OSError
  • 运行应用程序期间的 Grails 警告/错误

    目前 当我尝试在 Eclipse 中运行我的 Google App Engine Grails 测试应用程序时 我看到了以下警告 警告 目标导致名称覆盖 startLogging 警告 找不到 C Users Some Person gra
  • 如何知道子列表中某个元素的索引

    如何知道子列表中元素的索引 类似的问题在这里被问到 https stackoverflow com questions 176918 finding the index of an item given a list containing
  • UIAutomator Facebook 登录

    我为我的应用程序创建了一个 UIAutomator 登录测试 它适用于某些模拟器 问题是 它并不适用于所有人 UiObject input mDevice findObject new UiSelector instance 0 class
  • SPARQL 查询根据语句的顺序返回不同的结果

    我有一个 SPARQL 查询 它返回两个资源的最具体的常见类 当我尝试运行它时https dbpedia org sparql https dbpedia org sparql 有时它什么也不返回 有时它返回我想要的类 我注意到它与查询中语
  • Spring MVC + Hibernate:数据验证策略

    我们都知道 Spring MVC 通常与 Hibernate Validator 和 JSR 303 集成得很好 但正如有人所说 Hibernate Validator 只是用于 Bean Validation 的东西 这意味着更复杂的验证
  • ES6 类执行多态性的能力

    我试图通过 ES6 类来模拟多态性 以便能够更好地理解这个理论 概念很清楚 设计对象以共享行为并能够用特定行为覆盖共享行为 但恐怕我上面的代码不是一个有效的多态性示例 由于我缺乏经验 如果您能全面地回答以下问题 我将不胜感激 事实上 两个类