java类似php魔术方法_在 JS 中使用类似 PHP 的魔术方法

91b3df20aa15c22e41d6ed95b04087a2.png

JavaScript 魔术方法

这个脚本使用 Proxy 实现了在 JavaScript 中使用类似于 PHP 中的魔术方法。

示例

你可以这样使用它:const Foo = magicMethods(class Foo {

constructor () {

this.bar = 'Bar'

}

__get (name) {

return `[[${name}]]`

}

})

const foo = new Foo

foo.bar // "Bar"

foo.baz // "[[baz]]"

如果你使用的是像 Babel 这样的 JavaScript 编译器,并启用了装饰器, 你还可以使用 magicMethods 函数作为装饰器:@magicMethods

class 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教程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值