根据我在网上的了解,在 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(使用前将#替换为@)