pim*_*vdb 26 javascript dsl equality vector operator-overloading
是否可以在JavaScript中的类型实例之间定义自定义运算符?
例如,假设我有自定义矢量类,是否可以使用
vect1 == vect2
Run Code Online (Sandbox Code Playgroud)
检查是否相等,而底层代码是这样的?
operator ==(a, b) {
return a.x == b.x && a.y == b.y && a.z == b.z;
}
Run Code Online (Sandbox Code Playgroud)
(当然这是无稽之谈.)
我同意矢量原型上的相同功能是最佳解决方案.请注意,您还可以通过链接构建其他类似中缀的运算符.
function Vector(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
}
Vector.prototype.add = function (v2) {
var v = new Vector(this.x + v2.x,
this.y + v2.y,
this.z + v2.z);
return v;
}
Vector.prototype.equal = function (v2) {
return this.x == v2.x && this.y == v2.y && this.z == v2.z;
}
Run Code Online (Sandbox Code Playgroud)
更新:这是创建支持链接的Factory功能的更广泛示例.
不,JavaScript不支持运算符重载.您需要编写一个执行此操作的方法:
Vector.prototype.equalTo = function(other) {
if (!(other instanceof Vector)) return false;
return a.x == b.x && a.y == b.y && a.z == b.z;
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下方法:
vect1.equalTo(vect2)
Run Code Online (Sandbox Code Playgroud)
如果你想坚持==
运营商,你可以做的最好的事情:
function Vector(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
}
Vector.prototype.toString = function () {
return this.x + ";" + this.y + ";" + this.z;
};
var a = new Vector(1, 2, 3);
var b = new Vector(1, 2, 3);
var c = new Vector(4, 5, 6);
alert( String(a) == b ); // true
alert( String(a) == c ); // false
alert( a == b + "" ); // true again (no object wrapper but a bit more ugly)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12028 次 |
最近记录: |