Javascript V8:实现平等测试
如何在V8中为自己的类重新定义Javascript V8:实现平等测试,javascript,c++,v8,Javascript,C++,V8,如何在V8中为自己的类重新定义=运算符?例如: var v=Foo.BAR; var other=getBar();//返回与Foo.BAR相同的新实例 断言(v==其他);//我要真的 函数用C++在C++中定义,而不是直接在JS中定义。我知道这是可能的,因为它已经为String类完成了。V8开发人员 我知道这是可能的,因为这是为字符串类所做的 当然,JavaScript引擎可以并且确实定义了所有操作符所做的事情——这是它的工作。所以我不会说字符串的==操作符已经被重新定义;它只是被定义了
=
运算符?例如:
var v=Foo.BAR;
var other=getBar();//返回与Foo.BAR相同的新实例
断言(v==其他);//我要真的
函数用C++在C++中定义,而不是直接在JS中定义。我知道这是可能的,因为它已经为
String
类完成了。V8开发人员
我知道这是可能的,因为这是为字符串类所做的 当然,JavaScript引擎可以并且确实定义了所有操作符所做的事情——这是它的工作。所以我不会说字符串的
==
操作符已经被重新定义;它只是被定义了
如果您愿意修改V8,则可以更改==
操作符的行为。但这将是一个很大的工作,因为它不仅仅是定义了一个地方:你必须触摸C++运行时(从查看<代码> V8::对象::等于:/CUT>),点火解释器(查找<代码> TESTQuals<代码> > SRC/Delput/Delver Studio生成器.cc/COD>)和Turbofan编译器(grep代表src/compiler/
中的kJSEqual
,并调整在各个阶段的处理方式,最显著的是JSTypedLowering::ReduceJSEqual
,但可能还有其他地方你也需要去触摸)
请注意,这是一个庞大的项目;依我看,沿着这条路走是不可取的。一个特别的困难将是获取您需要的信息(特别是,“这个对象是有问题的类之一的实例吗?”)对于您需要它的所有地方,我没有一个好的建议来实现这一点。另一个挑战是,将您的更改移植到新的V8版本将是相当耗时的维护工作
我的建议是使用
.equals
函数,该函数精确地定义在应该拥有它的类上。它干净、简单,易于维护/调整,并且对任何其他JavaScript开发人员(包括您自己未来的开发人员)都不会感到惊讶阅读您的代码。为什么要这样做?这意味着您的程序/脚本将不再是标准的ECMAScript/JavaScript,也无法在其他引擎中工作。为什么不使用传统的函数equals(other)
方法呢?“我知道这是可能的,因为它已经为String类完成了。”-String
在JavaScript中不是一个类,它是一个内在类型,这就是为什么它有自己的=
操作符行为-但它与Number
和Date
相同,它们也有值相等的=
行为。“…这对任何其他JavaScript开发人员(包括您自己未来的自己)来说都不奇怪阅读您的代码”-这就是为什么运算符重载在支持它的语言中经常是一个坏主意。我希望更多的语言将运算符映射到众所周知的接口(例如,=
总是转到IEquatable.Equals
)。