[英]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.