Javascript 数据视图与原型继承
根据我在网上看到的,用JavaScript扩展对象的一种方法是首先克隆对象的原型,然后将该原型设置为子类的原型 不过,它在这里似乎不起作用:Javascript 数据视图与原型继承,javascript,prototype,Javascript,Prototype,根据我在网上看到的,用JavaScript扩展对象的一种方法是首先克隆对象的原型,然后将该原型设置为子类的原型 不过,它在这里似乎不起作用: // Create constructor ... function Packet(opcode, size) { DataView.call(this, new ArrayBuffer(size)); setInt8(0, opcode); } // Extend DataView ... Packet.prototype = Object.c
// 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
构造函数被设计为子类。可能是
用作类定义的扩展
子句的值。
打算继承指定的DataView
行为必须包括super
调用DataView
构造函数
创建并初始化具有内部状态的子类实例
支持内置方法所必需的
嘿,谢谢你的回答!我看到这个语法是在ES6中引入的。我对使用它犹豫不决,因为我不确定它得到了多大的支持。您知道这种语法与现代浏览器的兼容性吗?请参阅。请注意,
DataView
也是由ES6引入的(但它具有更高的兼容性,因为它最初是在ECMAScript之外指定的)。是否可以仅使用ES5继承对DataView进行子类化?@curiousdannii否,DataView对象有一个内部[[DataView]]插槽,并且不能使用ES5方式进行设置。
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);