如何在 javascript 中重载 [] 运算符
我似乎找不到在 javascript 中重载 []
运算符的方法。有谁知道吗?
我在想……
MyClass.operator.lookup(index)
{
return myArray[index];
}
或者我没有看到正确的事情。
I can't seem to find the way to overload the []
operator in javascript. Anyone out there know?
I was thinking on the lines of ...
MyClass.operator.lookup(index)
{
return myArray[index];
}
or am I not looking at the right things.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
您可以使用 ES6 代理(在所有现代浏览器中可用)来执行此操作,
查看< a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy" rel="noreferrer">MDN。
You can do this with ES6 Proxy (available in all modern browsers)
Check details on MDN.
您不能在 JavaScript 中重载运算符。
它被提议用于 ECMAScript 4 但被拒绝。
我认为你不会很快看到它。
You can't overload operators in JavaScript.
It was proposed for ECMAScript 4 but rejected.
I don't think you'll see it anytime soon.
我们可以代理get |直接设置方法。受到这个的启发。
We can proxy get | set methods directly. Inspired by this.
简单的答案是 JavaScript 允许通过方括号访问对象的子对象。
因此,您可以定义您的类:
然后您将能够使用任一语法访问类的任何实例上的成员。
The simple answer is that JavaScript allows access to children of an Object via the square brackets.
So you could define your class:
You will then be able to access the members on any instances of your class with either syntax.
使用代理。在答案的其他地方提到过,但我认为这是一个更好的例子:
Use a proxy. It was mentioned elsewhere in the answers but I think that this is a better example:
由于括号运算符实际上是属性访问运算符,因此您可以使用 getter 和 setter 来连接它。对于 IE,您必须使用 Object.defineProperty() 来代替。示例:
IE8+ 相同:
对于 IE5-7,仅存在
onpropertychange
事件,该事件适用于 DOM 元素,但不适用于其他对象。该方法的缺点是您只能挂钩对预定义属性集的请求,而不能挂钩没有任何预定义名称的任意属性。
As brackets operator is actually property access operator, you can hook on it with getters and setters. For IE you will have to use Object.defineProperty() instead. Example:
The same for IE8+:
For IE5-7 there's
onpropertychange
event only, which works for DOM elements, but not for other objects.The drawback of the method is you can only hook on requests to predefined set of properties, not on arbitrary property without any predefined name.
做到这一点的一种偷偷摸摸的方法是扩展语言本身。
第 1 步
定义自定义索引约定,我们称之为“[]”。
步骤 2
定义一个新的 eval 实现。 (不要这样做,但这是一个概念证明)。
上面的方法不适用于更复杂的索引,但可以进行更强大的解析。
替代方案:
您可以将符号编译为现有语言,然后对其进行评估,而不是创建自己的超集语言。这会减少第一次使用后解析本机的开销。
one sneaky way to do this is by extending the language itself.
step 1
define a custom indexing convention, let's call it, "[]".
step 2
define a new eval implementation. (don't do this this way, but it's a proof of concept).
the above won't work for more complex indexes but it can be with stronger parsing.
alternative:
instead of resorting to creating your own superset language, you can instead compile your notation to the existing language, then eval it. This reduces the parsing overhead to native after the first time you use it.
您需要按照说明使用 Proxy,但它最终可以
通过“this”集成到类构造函数中。然后 set 和 get(也称为 deleteProperty)函数将触发。虽然你得到一个看起来不同的 Proxy 对象,但它在很大程度上可以询问比较( target.constructor === MyClass )它的类类型等。 [即使它是一个函数,其中 target.constructor.name 是类名文本(只是注意到工作原理略有不同的示例。)]
You need to use Proxy as explained, but it can ultimately be integrated into a class constructor
with 'this'. Then the set and get (also deleteProperty) functions will fire. Although you get a Proxy object which seems different it for the most part works to ask the compare ( target.constructor === MyClass ) it's class type etc. [even though it's a function where target.constructor.name is the class name in text (just noting an example of things that work slightly different.)]
所以你希望做类似的事情
var 不管怎样 = MyClassInstance[4];
?
如果是这样,简单的答案是 Javascript 目前不支持运算符重载。
So you're hoping to do something like
var whatever = MyClassInstance[4];
?
If so, simple answer is that Javascript does not currently support operator overloading.
看看 Symbol.iterator。您可以实现用户定义的 @@iterator 方法来使任何对象可迭代。
例子:
Have a look at Symbol.iterator. You can implement a user-defined @@iterator method to make any object iterable.
Example:
类和代理可以组合:
记住代理处理所有 prop 访问。
class and proxy can be combined:
remember that proxy handles all prop access.