DataView 和原型继承

2023-12-24

根据我在网上的了解,在 JavaScript 中扩展对象的一种方法是首先克隆它的原型,然后将该原型设置为子类的原型。

但它似乎在这里不起作用:

// Create constructor ...
function Packet(opcode, size) {
  DataView.call(this, new ArrayBuffer(size));
  setInt8(0, opcode);
}

// Extend DataView ...
Packet.prototype = Object.create(DataView.prototype);

// Create class method ...
Packet.prototype.send = function(websocket) {
  // Send packet here ...
  websocket.send(this.buffer);
  console.log('Packet sent!');
}

var ws = new WebSocket("ws://localhost:1337");

ws.onopen = function() {
  var packet = new Packet(0, 5);

  // Create packet here ...
  packet.setInt32(1337);

  // Send packet over ws ...
  packet.send(ws);
}

在这里,我尝试扩展 DataView 以创建一个由 ArrayBuffer 内部支持的二进制“Packet”类。

不幸的是,当我尝试创建此类的实例时,JavaScript 抛出此错误:

Uncaught TypeError: Constructor DataView requires 'new'(…) 

并非所有构造函数都允许您调用它们,例如ES6 类:

class Foo {}
new Foo(); // OK
Foo(); // error
Foo.call(); // error

然而,DataView http://www.ecma-international.org/ecma-262/6.0/#sec-dataview-constructor可以使用子类化extends syntax:

The DataView构造函数被设计为可子类化。可能是 用作 a 的值extends类定义的子句。 打算继承指定的子类构造函数DataView行为必须包括super致电DataView构造函数到 使用内部状态创建并初始化子类实例 需要支持DataView.prototype http://www.ecma-international.org/ecma-262/6.0/#sec-dataview.prototype内置方法。

class Packet extends DataView {
  constructor(opcode, size) {
    super(new ArrayBuffer(size));
    this.setInt8(0, opcode);
  }
  send (websocket) {
    // Send packet here ...
  }
}
var packet = new Packet(0, 5);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataView 和原型继承 的相关文章

随机推荐

  • 为什么我们*应该*使用EventHandler

    我讨厌事件处理程序 我讨厌我必须投sender如果我想用它做任何事 我讨厌我必须创建一个继承自的新类EventArgs to use EventHandler
  • 零填充 numpy 数组

    在末尾用零填充数组的更Pythonic的方法是什么 def pad A length A np array 1 2 3 4 5 pad A 8 expected 1 2 3 4 5 0 0 0 在我的实际用例中 事实上我想将数组填充到最接近
  • facet_wrap 添加 geom_hline

    我的 ggplot 代码如下 facet wrap 函数在页面上为每个名称绘制 20 个图 并且沿 x 轴有 5 个 Pcode 我想计算每个名称的平均 TE Contr 并将该值绘制为每个图上的水平线 由 Facet wrap 分割 目前
  • Java Swing 按钮颜色[重复]

    这个问题在这里已经有答案了 我正在使用 NET Beans IDE 在 LINUX 中开发我的应用程序 我使用 Syntheta 包来生成新的外观和感觉 到目前为止一切都很好 现在 我的下一阶段是在某些数据库状态发生变化时为按钮添加颜色 例
  • MySQL 中的数字序列

    在Python中 如果我想要一个从0到9 含 的序列 我会使用 xrange 0 10 有什么办法可以在 MySQL 中做到这一点吗 由于不存在 xrange 这样的东西 因此可以使用一个单独的表来存储整数 如前所述 或者只是创建一个存储过
  • 如何将 Instagram feed 嵌入我的网站 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试将客户端的 Instagram feed 集成到网站侧边栏 我的网站堆栈是 Bootstrap Vanilla JS Jqu
  • mysql 外键约束格式不正确错误

    我有两张桌子 table1是带有列的父表ID and table2有一个柱子IDFromTable1 不是真实的名字 当我戴上FK时IDFromTable1 to ID in table1我收到错误Foreign key constrain
  • Neo4j 非托管扩展和 GuardTimeoutException

    我非常需要一些关于我在 Java 中构建的 Neo4j 非托管扩展时遇到的问题的建议 我创建了一个非常简单的代码示例来突出我的问题 基本前提是我想设置 org neo4j server webserver limit executionti
  • 为什么大多数 JavaScript 原生函数都比它们的原始实现慢?

    我注意到了some http jsperf com map native vs implemented tests http jsperf com concat tests blabla原生 JavaScript 函数通常比简单的实现慢得多
  • 观察 SharedPreferences 数据

    我正在尝试观察共享偏好中的数据变化 我找到了这个similar https stackoverflow com questions 50649014 livedata with shared preferences问题回答者 SimplyP
  • 如何将H2Database数据库文件转换为MySQL数据库.sql文件?

    我有一些数据H2数据库 http www h2database com html main html文件 我想将其转换为 MySQL sql数据库文件 我可以遵循哪些方法 根据 Thomas Mueller 的回答 SquirrelSQL
  • Facebook Canvas APP (Iframe) 自动调整高度

    最近遇到了 Facebook canvas iframe 应用程序的问题 我已将设置设置为 自动调整大小 并实现了正确的 FB JS 调用来调整高度大小 以避免出现不需要的滚动条 但它似乎不起作用 还有其他人遇到过这个问题或提出解决方案吗
  • 如何在dart中使用HttpClient发出HTTPS请求?

    我正在使用 dart 中的 HttpClient dart io 包 而不是 dart http 并且我想发送 HTTPS 请求 有没有办法做到这一点 我似乎找不到一种方法可以让我做到这一点 new HttpClient getUrl Ur
  • 如何使用 Firestore 填充参考字段

    您知道如何使用 Firestore 填充文档上的参考字段吗 当您创建 获取文档参考时 您可以将其保存到另一个文档中 此示例适用于 Node SDK 但它应该能让您了解如何在 Android 上实现此示例 创建文档参考 Create the
  • 悬停在重叠的 CSS3 形状上

    好吧 我有一个关于与通过 CSS3 创建的形状进行交互的潜在棘手问题 请参阅以下小提琴 http jsfiddle net MH4LN 1 http jsfiddle net MH4LN 1 代码示例 div class container
  • 是否可以在不调用“node”的情况下运行 Node.js 脚本?

    我喜欢 javascript 所以当我听说时我很兴奋Node js http nodejs org 一个基于 V8 的 Javascript 运行时 我更愿意使用 Javascript 来编写 shell 脚本 我的问题是 如何在不调用的情
  • jquery 选择图像

    我希望允许用户选择预先上传的图像到用户生成的网页 我有一个可用图像的列表 因此我可以使用选择控件轻松地完成此操作 但是 我真的很想允许用户从缩略图弹出窗口中进行选择 而不是文本 然后填充文本带有结果文件名的表单元素 我希望最终结果会像日历弹
  • 在GDB中,如何打印具有特殊字符的符号的内容?

    我在用GDB调试的时候遇到一个小问题 问题是这样的 当我想获取 main 的地址时 我可以这样做 gdb peda p main 1
  • 端子输出安全逃生功能

    我正在寻找相当于网址编码 http docs python org library urllib html urllib quote plus对于终端输出 我需要确保我 可能 从外部源打印的垃圾字符最终不会在我的终端上做一些奇怪的事情 所以
  • DataView 和原型继承

    根据我在网上的了解 在 JavaScript 中扩展对象的一种方法是首先克隆它的原型 然后将该原型设置为子类的原型 但它似乎在这里不起作用 Create constructor function Packet opcode size Dat