JavaScript 魔术方法
这个脚本使用 Proxy 实现了在 JavaScript 中使用类似于 PHP 中的魔术方法。
示例
你可以这样使用它:
立即学习“PHP免费学习笔记(深入)”;
const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (name) { return `[[${name}]]` }})const foo = new Foofoo.bar // "Bar"foo.baz // "[[baz]]"
登录后复制
如果你使用的是像 Babel 这样的 JavaScript 编译器,并启用了装饰器, 你还可以使用 magicMethods 函数作为装饰器:
@magicMethodsclass Foo { // ...}
登录后复制
支持魔术方法
给定一个类 Class 和 instance,以下是此脚本支持的魔术方法:
__get(name)
当尝试访问 instance[name],而 name 不是 instance 中的属性时,调用。
注意: 在 PHP 中,检查 instance 中是否存在 name 不会使用任何自定义的 __isset() 方法。
__set(name, value)
当尝试使用 instance[name] = …,而 instance 并未设置 name 属性时,调用该方法。
__isset(name)
当尝试通过调用 name in instance 来检查是否存在 name 是否存在时,调用该方法。
__unset(name)
当尝试通过 delete instance[name] 来取消 name 属性设置时,调用该方法。
其他方法
下面的魔术方法是通过该脚本提供支持的,但不支持在 PHP:
static __getStatic(name)
类似于 __get(),但是它用在 Class 而不是 instance.
static __setStatic(name, value)
类似于 __set(),但是用在 Class 中而不是 instance。
为什么不支持魔术方法 X?
它们不是没有必要就是不实用:
__construct() 不需要,JavaScript 早有 constructor。
__destruct():JavaScript 中没有对象销毁的钩子机制。
__call():与 PHP 相反,方法就像 JavaScript 中的属性一样,首先通过 __get() 获取。要实现 __call(),你只需从 get() 返回一个函数。
__callStatic():与 __call() 类似,但是具有 __getStatic()。
__sleep(),__wakeup():JavaScript 没有内置序列化与反序列化。你可以使用 JSON.stringify() 与 JSON.parse(),但是它们没有机制自动触发的任何方法。
__toString() 在早有对应 JavaScript 的 toString()
__invoke():如果你试图调用一个非函数对象,JavaScript 将会抛出一个错误,这将无法避免。
__set_state():JavaScript 中没有类似于 var_export() 的东西。
__clone():JavaScript 中内置克隆功能的钩子。
__debugInfo(): 无法挂接到 console.log() 输出。
我可以使用魔术方法扩展类吗?
是的,在一定程度上:
class Bar extends Foo {}// 或者,如果类 Bar 本身包含魔术方法:const Bar = magicMethods(class Bar extends Foo { // ...})
登录后复制
但是遗憾的是,你无法从子类中访问父类中的属性:
const Foo = magicMethods(class Foo { __get() { return this.bar() }})class Bar extends Foo { bar() { return 'value' }}// 这个 *不会* 调用 B 的 bar() 方法,而是抛出一个类型错误:(new Bar).something
登录后复制
推荐教程:《JS教程》
以上就是在 JS 中使用类似 PHP 的魔术方法的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2728484.html