繁体   English   中英

如何在 JavaScript 中子类化/扩展 TypedArrays?

[英]How do I subclass/extend TypedArrays in JavaScript?

我正在用 CoffeScript (so JS) 编写一个库,它的数学很重。我真的需要使用类型化数组 (Float64Array) 以及它们提供的所有性能。

那么扩展类型化数组功能的最佳方法是什么?

目前我正在做类似功能:

Vector =
    create: (ag...) ->
        CGE2Point.create ag...
    dot: (i,j) ->
        i[0]*j[0] + i[1]*j[1]
    add: (i,j) ->
        @.create i[0]+j[0], i[1]+j[1]
    sub: (i,j) ->
        @.create i[0]-j[0], i[1]-j[1]
    mul: (s,v) ->
        @.create s * v[0], s * v[1]
    div: (s,v) ->
        @.create v[0] / s, v[1] / s

但是拥有一个继承自类型化数组的 Vector 对象会非常好。 我知道这种方法:

class Vector extends Float64Array

创建一个没有类型数组全部好处的类 关于子类化数组的问题,阅读以下文章Dean Edwards建议从 iframe 获取对象副本,这个其他参考以其他方式做对不起 Dean 但是类型化数组没有所有这些方法。

那么,对类型化数组进行子类化的正确(或至少是最优雅和最高效)的方法是什么? 还是我应该写所有类似的功能?

在 JavaScript 中子类化数组是不可能的。 Kangax(以 Prototype 闻名)详细阐述了它是如何/为什么不起作用的。

正如其他人所说:唉,您不能以任何有意义的方式子类化数组(或类型化数组)。 但是您可以创建一个别名,例如

global.Vector = Float64Array

您可以向Float64Array原型添加其他方法,例如

Float64Array::last = -> @[@length - 1]

从模块化的角度来看,这并不理想,但对于一个独立的应用程序,能够添加这种语法糖是很好的。

可以使用class语法扩展 TypedArrays。

class Vector extends Float64Array {
  constructor(i=0, j=0) {
    super([i, j])
  }
}
> new Vector()
Vector(2) [Float64Array] [0, 0]

规范的相关部分:

23.2.5 TypedArray构造函数每个TypedArray构造函数:

  • ...
  • 可以用作类定义的扩展子句的值。 打算继承指定TypedArray行为的子类构造函数必须包含对TypedArray构造函数的超级调用,以创建和初始化具有支持 %TypedArray%.prototype 内置方法所需的内部状态的子类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM