根据我在网上发布的内容,在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'(…)
答案 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);