根据我在网上看到的,在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抛出了这个错误:
Uncaught TypeError: Constructor DataView requires 'new'(…) 发布于 2016-03-17 18:19:34
并非所有构造函数都允许您调用它们,例如,ES6类:
class Foo {}
new Foo(); // OK
Foo(); // error
Foo.call(); // error但是,可以使用DataView语法对extends进行子类:
DataView构造函数设计为可子类。它可以用作类定义的extends子句的值。打算继承指定DataView行为的子类构造函数必须包括对DataView构造函数的super调用,以创建和初始化具有支持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);https://stackoverflow.com/questions/36068518
复制相似问题