通过伪经典实例化掌握原型继承(JavaScript)

2023-11-23

我正在尝试通过 JavaScript 使用继承来通过测试套件。下面是我到目前为止的代码片段:

var Infant = function() {
    this.age  = 0;
    this.color = 'pink';
    this.food = 'milk';

};
Infant.prototype.eat = function(){
    return this.eat;
}


var Adolescent = function() {

    this.age = 5;
    this.height = 'short';
    this.job = 'keep on growing';

};

我想继承 Infant 类的 food 属性和 eat 方法,但我的尝试没有成功。我最初的想法是分配 this.Adolescent = Infant.food;但这没有用。我知道我需要将婴儿设置为超级类,但我正在旋转我的轮子


在 JavaScript 中使用构造函数进行继承时,您:

  1. 使prototype“派生”构造函数的属性,其原型是的对象prototype“基”构造函数的属性。

  2. Set the constructor“派生”构造函数的属性prototype属性指向“派生”构造函数。

  3. 使用正确的方法从“派生”构造函数调用“基”构造函数this.

像这样:

var Infant = function() {
    this.age  = 0;
    this.color = 'pink';
    this.food = 'milk';
};
Infant.prototype.eat = function(){
    return /*...something...*/; // Returning `this.eat` doesn't make any sense, that's the function we're in
};

var Adolescent = function() {

    // #3 Give super a chance to initialize the instance, you can pass args if appropriate
    Infant.call(this);

    this.age = 5;
    this.height = 'short';
    this.job = 'keep on growing';
};

// Set up Adolescent's prototype, which uses Infant's prototype property as its prototype
Adolescent.prototype = Object.create(Infant.prototype);     // #1
Object.defineProperty(Adolescent.prototype, "constructor",  // #2
    value: Adolescent,
    writable: true,
    configurable: true
});
// (In pre-ES5 environments that don't event have `Object.defineProperty`, you'd use
// an assignment instead: `Adolescent.prototype.constructor = Adolescent;`

Object.create是在 ES5 中添加的,因此它不会出现在过时的 JavaScript 引擎(如 IE8 中的引擎)上。上面使用的单参数版本可以是容易垫片, 尽管。

在 ES2015 中,我们可以选择使用新的class语义:

class Infant {
    constructor() {
        this.age  = 0;
        this.color = 'pink';
        this.food = 'milk';
    }

    eat() {
        return /*...something...*/;
    }
}

class Adolescent extends Infant {            // extends does #1 and #2
    constructor() {
        super();                             // #3, you can pass args here if appropriate

        this.age = 5;
        this.height = 'short';
        this.job = 'keep on growing';
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过伪经典实例化掌握原型继承(JavaScript) 的相关文章

随机推荐

  • Qt - 定时器只能与以 QThread 启动的线程一起使用

    我的代码是 class ExampleTest public QObject Q OBJECT public ExampleTest private Q SLOTS void DoAllExampleTests void ExampleTe
  • array_intersect,但针对单个数组变量的子数组

    我有一个看起来像这样的数组 foo array 0 gt array a b c d 1 gt array b c d 2 gt array b d f 我会参考 foo 0 foo 1 and foo 2 作为子数组 我基本上需要执行ar
  • 缩小图像大小以适合表格单元格,这适用于所有浏览器吗?

    我有一个table它的单元格中有图像 我希望这些图像在窗口宽度减小时自动缩小 但他们应该not当周围有额外空间时 它们会扩展到超出其原始大小 我有一个解决方案 适用于 Chrome 但不适用于 Firefox 或 Internet Expl
  • 如何在一页上添加两个Google图表?

    我做了什么 我已将 Google 图表添加到我的页面顶部 这将返回图表的图像 我需要做什么 我只需要将第二个图表添加到同一页面即可 问题 第二个图表的代码将被忽略 我很大程度上怀疑这是由于我错误地组合了每个图表的代码 The code 第一
  • Flutter - 选择项目后折叠 ExpansionTile

    我想得到ExpansionTile在我选择一个项目后折叠 但它不会关闭打开的列表 我尝试使用onExpansionChanged财产但我没有成功 你如何解决这个问题 插入一个 gif 来证明ExpansionTile选择项目后不会崩溃 下面
  • 无法绑定到“占位符”,因为它不是“ng-multiselect-dropdown”的已知属性

    我想实现自动完成功能 因此我发现的一个相同选项是使用多选下拉菜单 所以我使用了这个模块 https www npmjs com package ng multiselect dropdown 但在同上实施后 我收到这些错误 Error ER
  • 如何检查Python中的字符串中是否有*任一*字符? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道 if a in cat win 但有没有更好的方法来查找是否either字符串中存在两个字母 以下是一些方法 if a in cat or d in cat win if
  • 如何将逗号分隔的数字字符串转换为整数数组?

    说我有绳子1 2 3 4 5我想将其转换为整数数组 最好的方法是什么 我知道我可以使用爆炸来创建一个带有字符串的数组 但我需要数组项是整数 您可以使用array map申请intval分解字符串后的每个数组项 string 1 2 3 4
  • 使用 scrapy 蜘蛛间歇性“getrandom() 初始化失败”

    我构建了一个 scrapy 蜘蛛 scrapy 1 4 该蜘蛛是通过 django rq 和supervisord 从 django 网站按需触发的 这是正在监听 django rq 事件的supervisord 作业 reddit 用作代
  • 检索 ASP.NET 中的所有发布值

    我正在创建一个 ASP NET 应用程序 它允许用户将表单元素添加到表单内的页面 当页面发布时 通过提交按钮 我需要循环遍历表单中所有发布的值并获取值 我无法检查具体值 因为我不知道会有多少个值或它们将被称为什么 有人可以指出我获取所有发布
  • 如何将数据集拆分/分区为训练和测试数据集,例如交叉验证?

    将 NumPy 数组随机拆分为训练和测试 验证数据集的好方法是什么 类似的东西cvpartition or crossvalindMatlab 中的函数 如果你想将数据集分成两部分 你可以使用numpy random shuffle or
  • 当需要相同类型的多个实例时,使用 Unity 进行 DI

    我需要这方面的帮助 我使用 Unity 作为容器 并且想将同一类型的两个不同实例注入到我的构造函数中 class Example Example IQueue receiveQueue IQueue sendQueue IQueue 是在我
  • OrderedDict 在 Python 3.7 中会变得多余吗?

    来自Python 3 7 变更日志 插入顺序保存性质dict物体已宣布成为 Python 语言规范的正式部分 这是否意味着OrderedDict会变得多余吗 我能想到的唯一用途是保持与旧版本 Python 的向后兼容性 旧版本的 Pytho
  • Boost::Asio,SSL 连接问题

    我已经尝试解决我的问题几天了 但就是无法解决 我尝试使用 Boost Asio 库和 OpenSSL 进行 SSL 连接 有一个示例代码 如何做到这一点 http www boost org doc libs 1 55 0 doc html
  • 如何使用selenium获取特定元素的html源?

    我正在查看的页面包含 div p text 1 p h1 text 2 h1 text 3 p text 4 p div 我想获取 div 中的所有文本 除了
  • 阿特金分段筛可能吗?

    我知道可以实现埃拉托斯特尼筛法 以便它连续找到素数而没有上限 分段筛 我的问题是 阿特金 伯恩斯坦筛法可以用同样的方式实现吗 相关问题 C 如何使阿特金筛增量 然而相关问题只有1个答案 即 对于所有筛子都是不可能的 这显然是不正确的 Atk
  • 文件 InfoPlist.strings 无法打开

    谁能帮帮我吗 我应该如何修复错误 无法打开文件 InfoPlist strings 因为没有这样的文件 它是在我从 SVN 更新我的项目后出现的 实际上我的项目中有 InfoPlist strings 我不知道为什么 Xcode 没有看到它
  • 写入现有 Excel 文件

    package jexcel jxl nimit import java awt Label import java io File import java io IOException import jxl Cell import jxl
  • 删除数据表中的主键

    有没有办法从数据表中删除主键或者有没有办法先删除 PK 的约束 然后删除列本身 Thanks UPDATED dtTable Columns Add new System Data DataColumn PRIMARY KEY typeof
  • 通过伪经典实例化掌握原型继承(JavaScript)

    我正在尝试通过 JavaScript 使用继承来通过测试套件 下面是我到目前为止的代码片段 var Infant function this age 0 this color pink this food milk Infant proto