2013-03-11 128 views
0
var vector = function(x, y, z) { 
    this[0] = x || 0; 
    this[1] = y || 0; 
    this[2] = z || 0; 
}; 

vector.prototype = new Float32Array(3); 

vector.prototype.getLength = function() { 
    return Math.sqrt(Math.pow(this[0],2)+Math.pow(this[1],2)+Math.pow(this[2],2)); 
}; 

該向量是一個帶有3個元素的float32array。我不知道爲什麼它不起作用。如果我運行此代碼,我得到一個錯誤:'vec3.length' is not a function如何從Float32Array創建矢量原型?

var vec3 = new vector(3,4,5); 
alert(vec3.getLength()); 

編輯:我換成lengthgetLength。現在它可以在除了Firefox之外的任何地方使用

回答

2

lengthFloat32Array的屬性是只讀,所以你不能用函數替換它。在目前的規範草案,您可以在Section 7看到:

interface TypedArray { 
    const unsigned long BYTES_PER_ELEMENT = element size in bytes; 

    readonly attribute unsigned long length; // <=== Note `readonly` 

    getter type get(unsigned long index); 
    setter void set(unsigned long index, type value); 
    void set(TypedArray array, optional unsigned long offset); 
    void set(type[] array, optional unsigned long offset); 
    TypedArray subarray(long begin, optional long end); 
}; 

正如您編輯:

I replaced length with getLength . Now it works everywhere except in firefox: (intermediate value).getLength is not a function

不是真的很酷換出這樣的問題的內容。但是Firefox可能會認爲Float32Array對象是不可擴展的。如果是這樣,您可能需要添加另一個圖層,以便您可以將中間原型設置爲getLength。例如:

function protovector() { 
} 
protovector.prototype = new Float32Array(3); 

function vector(/* ... */) { 
} 
vector.prototype = new protovector(); 
vector.prototype.getLength = function() { 
    // ... 
}; 

或者只是把lengthgetLength上的實例:

function vector(/* ... *) { 
    // this[0] = ... 
    this.length = function() { 
     // ... 
    }; 
} 

但由於類型化數組的長度是固定設置在施工時間,我不知道你有多少得到首先使用Float32Array作爲原型。

+0

我用'getLength'替換'length'。現在它可以在除firefox以外的任何地方工作:'(中間值).getLength不是函數' – defunct 2013-03-11 22:08:50

+1

@defunct:Firefox可能會認爲'Float32Array'對象是不可擴展的。如果是這樣,您可能需要添加另一個圖層,以便您可以在中間原型上使用getLength。 (例如,'protovector.prototype = new Float32Array(3); vector.prototype = new protovector();'或者只是將'length'或'getLength'放在實例上,但是由於類型化數組在設計時是固定長度的,我不知道你有多少首先使用'Float32Array'作爲原型 – 2013-03-11 22:10:34

+0

所以沒有辦法在firefox中管理它嗎?我的向量只是一個帶有一些函數的Float32Array – defunct 2013-03-11 22:13:38