最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-02 22:16:49
文档

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

在 JS 中使用类似 PHP 的魔术方法:JavaScript 魔术方法这个脚本使用 Proxy 实现了在 JavaScript 中使用类似于 PHP 中的魔术方法。示例你可以这样使用它:const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (
推荐度:
导读在 JS 中使用类似 PHP 的魔术方法:JavaScript 魔术方法这个脚本使用 Proxy 实现了在 JavaScript 中使用类似于 PHP 中的魔术方法。示例你可以这样使用它:const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (


__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 的魔术方法

在 JS 中使用类似 PHP 的魔术方法:JavaScript 魔术方法这个脚本使用 Proxy 实现了在 JavaScript 中使用类似于 PHP 中的魔术方法。示例你可以这样使用它:const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (
推荐度:
标签: 中的 如何在 方法
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top