首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >V8:实现等式测试

V8:实现等式测试
EN

Stack Overflow用户
提问于 2019-09-07 20:58:54
回答 1查看 210关注 0票数 2

如何在V8中为自己的类重新定义V8运算符?例如:

代码语言:javascript
复制
var v = Foo.BAR;
var other = getBar(); // returns a new instance of the same as Foo.BAR

assert(v == other); // I want true

这些函数是在C++中用V8定义的,而不是直接在JS中定义的。我知道这是可能的,因为它已经为String类做了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-07 22:26:17

这里是V8开发人员。

我知道这是可能的,因为它已经做了字符串类。

当然,JavaScript引擎能够并且确实定义了所有操作符所做的事情--这就是它的工作。因此,我不会说==运算符是字符串的re_defined;它仅仅是_defined。

如果您愿意修改V8,那么您可以更改==操作符的行为。但是这需要做很多工作,因为定义它的地方不只是一个:您必须接触C++运行时(首先查看v8::internal::Object::Equals)、点火解释器(查找src/interpreter/interpreter-generator.cc中的TestEquals )和Turbofan编译器( kJSEqual in src/compiler/中的grep,并调整在不同阶段处理它的方式,最显著的是JSTypedLowering::ReduceJSEqual,但可能还有其他地方需要触摸)。

请注意,这是一个庞大的项目;IMHO,它是不可取的走这条路。一个特殊的困难将是获取所需的信息(具体来说,“这个对象是其中一个类的实例吗?”)所有你需要它的地方,我没有一个好的建议来完成它。另一个挑战是将您的更改移植到新的V8版本将是相当耗时的维护工作。

我的建议是使用一个.equals函数,它精确地定义在应该拥有它的类上。这是干净而简单的,易于维护/可适应,对于任何其他JavaScript开发人员(包括您自己未来的自己)来说,阅读您的代码都是不足为奇的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57837430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档