Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数据视图与原型继承_Javascript_Prototype - Fatal编程技术网

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

根据我在网上看到的,用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
构造函数被设计为子类。可能是 用作类定义的
扩展
子句的值。 打算继承指定的
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);