首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataView与原型继承

DataView与原型继承
EN

Stack Overflow用户
提问于 2016-03-17 18:10:59
回答 1查看 254关注 0票数 4

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

不过,它似乎在这里不起作用:

代码语言: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在内部支持的二进制“数据包”类。

不幸的是,当我试图创建这个类的一个实例时,JavaScript抛出了这个错误:

代码语言:javascript
复制
Uncaught TypeError: Constructor DataView requires 'new'(…) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-17 18:19:34

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

代码语言:javascript
复制
class Foo {}
new Foo(); // OK
Foo(); // error
Foo.call(); // error

但是,可以使用DataView语法对extends进行子类:

DataView构造函数设计为可子类。它可以用作类定义的extends子句的值。打算继承指定DataView行为的子类构造函数必须包括对DataView构造函数的super调用,以创建和初始化具有支持DataView.prototype内置方法所需的内部状态的子类实例。

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36068518

复制
相关文章

相似问题

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