JavaScript 中的 Python 魔法方法

问题描述 投票:0回答:1

我是一名新的 JavaScript 编码员,正在尝试找出类。

我想知道 JavaScript 中是否有某些东西具有与 Python 的

__str__
__add__
类似的功能,或者任何类似的神奇方法,这样我就可以在两个类相加时运行一个函数。

javascript python magic-methods
1个回答
0
投票

TLDR:你不能重载运算符,但是有一些技巧可以让你得到类似的东西。

以正确的方式做事

有各种预处理器可以将重载运算符重写为方法调用,但这是部署时解决方案而不是运行时解决方案。

有一个 TC-39 提案 向该语言添加运算符重载,但这还不是语言功能。

黑客

添加规范的相关部分是这里。结果是,当您将对象视为数字或字符串时,会调用

valueOf
toString
方法;首先调用哪一个取决于上下文。不过,结果必然是一个数字或字符串,因此您不能将两个对象相加并返回一个对象。

也就是说,有些黑客可以在函数调用上下文中伪造运算符重载。例如,你可以写这样的东西并得到合理的结果:

let x = Vector(1,2,3);
let y = Vector(4,5,6);
let z = Vector(7,8,9);
let sum = Vector(()=>x+y*z); // using * to mean dot product
// sum === Vector(122,244,366)

有一些技巧。第一个是它覆盖向量上的

valueOf
以将
this
推入堆栈。第二个是函数
Vector
查看它获得的参数的数量和类型。当它获取单个函数时,它会调用该函数,从而导致变量最终进入堆栈;然后它使用函数上的
toString()
方法来获取源代码,它解析源代码,从堆栈中弹出实际向量,计算表达式,然后返回结果。不用说,这是非常低效的。

甚至还有一些更丑陋的黑客可以让你取消匿名函数,但深入细节超出了范围。

© www.soinside.com 2019 - 2024. All rights reserved.