2017-02-25 50 views
1

我正尝试在我的应用程序中使用自定义运算符进行自定义类的运算,该运算符与ClearScript接口。下面是我的榜样自定义类的一个片段:在ClearScript中重载操作符

public class Vector3 { 
    public float x { get; set; } 
    public float y { get; set; } 
    public float z { get; set; } 

    public Vector3(float x, float y, float z) { 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 

    public static Vector3 operator +(Vector3 a, Vector3 b) { 
     return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z); 
    } 
} 

我ClearScript引擎正确初始化,并且我能正确使用JavaScript初始化Vector3对象,并修改相应的属性。但是,如果我在Javascript环境中初始化2个Vector3对象,并尝试使用Javascript添加运算符,它最终会将添加运算符评估为字符串连接,而不是我的自定义运算符。

实施例:

var a = new Vector3(1, 1, 1); 
var b = new Vector3(0, 2, -1); 

var c = a + b; 

print(typeof a); //returns "function" (which is correct) 
print(typeof b); //returns "function" (which is also correct) 

print(typeof c); //returns "string" (should return function) 

可变c仅包含string[object HostObject][object HostObject]),代替Vector3对象。

我该如何让JavaScript引擎知道调用我的自定义运算符而不是使用使用ClearScript的默认Javascript运算符?

回答

1

JavaScript的+ operator返回数字加法或字符串连接的结果。你不能超载它。对象可以覆盖valueOf和/或toString以影响操作数转换,但无法覆盖操作本身。

如果你不能直接从JavaScript调用您的自定义操作,尝试添加一个包装成为一个正常的方法:

public Vector3 Add(Vector3 that) { return this + that; } 

然后,在JavaScript:

var c = a.Add(b); 

它不像优雅,但它应该工作。

+0

Darn,这就是我认为的情况,但我希望可能在ClearScript的一边做了一些奇怪的反射来使我的用例成为可能。我会用你的解决方案,谢谢! –