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
var vec3 = new vector(3,4,5);
alert(vec3.getLength());
编辑:我用
length
替换了getLength
。现在,除了在Firefox中,它在任何地方都可以使用。 最佳答案
length
的Float32Array
属性是只读的,因此您不能将其替换为函数。在当前的规范草案中,您可以在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);
};
截至您的编辑:
我用
length
替换了getLength
。现在它可以在除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() {
// ...
};
或者只是将
length
或getLength
放在实例上:function vector(/* ... *) {
// this[0] = ...
this.length = function() {
// ...
};
}
但是由于类型化数组在构造时设置为固定长度,所以我不确定首先使用
Float32Array
作为原型会有多少好处。