【问题标题】:JS, How extend typed arrays subclassing ?? How to do it right?JS,如何扩展类型化数组的子类化?怎么做才对?
【发布时间】:2012-06-15 21:35:23
【问题描述】:

我正在用 CoffeScript(所以 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

创建一个不具备类型数组Question about subclassing array 的全部好处的类,阅读以下文章Dean Edwards 建议从iframe 获取对象副本,此其他参考以其他方式执行Sorry Dean。但是类型化数组没有所有这些方法。

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

【问题讨论】:

标签: javascript arrays floating-point coffeescript subclass


【解决方案1】:

在 JavaScript 中子类化数组是不可能的。 Kangax (of Prototype fame) has written up a thorough elaboration 如何/为什么它不起作用。

【讨论】:

  • 使用 ES6 代理似乎可以取得一些进展,但性能会显着下降。
【解决方案2】:

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

global.Vector = Float64Array

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

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

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

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2014-12-01
    • 2018-12-30
    • 2016-12-14
    相关资源
    最近更新 更多