DataView和原型继承

时间:2016-03-17 18:11:00

标签: javascript prototype

根据我在网上发布的内容,在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以创建二进制文件" Packet"由ArrayBuffer内部支持的类。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  

DataView构造函数设计为可子类化。它可能是   用作类定义的extends子句的值。   打算继承指定DataView的子类构造函数   行为必须包含对super构造函数的DataView调用   使用内部状态创建和初始化子类实例   必须支持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);