0

我的问题是 Adob​​e JS 特有的,但我几乎可以肯定它的相关性更普遍。

首先,请考虑特定情况:Adobe JS API for 3D 有一个名为 Matrix4x4 的对象。在 API 参考中,我可以阅读到它的 5 个属性:行列式、逆向、scaleComponent、平移和转置。

在我的代码中,我有一个 Matrix4x4 对象。运行“for (var i in Matrix4x4)”,我得到了上述属性。因此 Matrix4x4[i] 可能是例如逆矩阵。

但是, Matrix4x4.toString() 准确地返回了我需要的原始矩阵值,但采用以下字符串格式:

Matrix4x4: (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1)

Matrix4x4.toSource() 奇怪地给出 ({}) 即一个空对象。

现在,我的目标是编写一个函数或原型来像 .toString() 一样获取矩阵的值,但没有标题“Matrix4x4:”(注意 Matrix4x4 等于 constructor.name)并且没有换行符(回车)。我尝试使用 eval(Matrix4x4.toString())、eval("{"+Matrix4x4.toString()+"}") 或 eval("({"+Matrix4x4.toString()+"})") 但它似乎字符串的格式不正确。我想应该有两个 ' 来包围矩阵值并且没有换行符。

是否可以覆盖 .toString() 方法或编写自定义原型来检索当前 .toString() 以一种实际上非常接近文字对象的奇怪格式打印的相同值?

如前所述,我没有成功地达到 .toString() 以任何其他方式返回的对象值,但它们必须位于对象内部的某个位置,因为 .toString() 显示它们并且我认为它们是所有其他属性的参数。例如, .determinant 几乎可以肯定是根据它们计算的。

谢谢

4

1 回答 1

0

不确定您要做什么,您说您想要一个字符串,但要尝试使用 eval 创建一个对象。也许这会成功:

Matrix4x4.prototype.toObject=function(){
 return{
   determinant:this.determinant,
   inverse:this.inverse,
   scaleComponent:this.scaleComponent,
   translation:this.translation.
   transpose:this.transpose
 };
}

如果您尝试克隆该对象,则它会变得更加复杂。您可以查看 jQuery.extend(使用它或使用它们在您自己的代码中实现它的方式)。

请注意,for (var i in Matrix4x4)除非您更改某些代码,否则添加到原型将中断(将其添加到):

for (var i in m44){
 if(m44.hasOwnProperty(i)){
   console.log(i);
 }
}
于 2013-07-18T12:43:54.127 回答