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

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

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

(0)
上一篇 2025年3月7日 23:56:25
下一篇 2025年3月5日 15:52:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js中输出的方式有哪些

    js中输出的方式有: 1、使用 window.alert() 弹出警告框。 2、使用 document.write() 方法将内容写到 HTML 文档中。 3、使用 innerHTML 写入到 HTML 元素。 4、使用 console.l…

    2025年3月7日 编程技术
    200
  • js如何实现函数防抖与节流

    概念理解 防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 节流:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。 相关推荐:《javascript高级教程》 js函数防抖与节流…

    编程技术 2025年3月7日
    200
  • 快速理解 JavaScript 的垃圾回收

    前言 JS具有自动垃圾回收机制,换句话说,执行环境会管理代码执行过程中使用的内存。 JS垃圾回收的原理 执行环境会找出那些不再继续使用的变量,然后释放其占用的内存。 立即学习“Java免费学习笔记(深入)”; JS垃圾回收的策略 标记清除 …

    2025年3月7日
    200
  • JS 基本类型与引用类型值

    引入概念:基本类型和引用类型 1、可以感受到,JS 的变量及其松散,那么,正是 JS 变量松散 的本质,决定了:JS 变量名只是 一个在特定的时间用于保存特定值的一个名字 而已,也就是说,变量的值及其数据类型可以在脚本的生命周期内改变 ,尽…

    2025年3月7日 编程技术
    200
  • JS 中 setTimeout 和 setInterval 区别

    JS中 setTimeout 和 setInterval 区别 setTimeout方法的作用是在指定的毫秒数后执行函数或表达式,而setInterval方法则是在每隔指定的毫秒数循环执行函数或表达式,直到clearInterval方法将其…

    2025年3月7日
    200
  • js中的typeof和instanceof和===的区别

    js中的typeof和instanceof和===的区别 typeof:用于判断number/string/boolean/underfined类型/function,不能判断:null和object ,不能区分object和Array i…

    2025年3月7日
    200
  • JS 深拷贝的三种实现方式

    本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。 JS 深拷贝的三种实现方式 1、将对象转换为JSON字符串形式,再将其转换为原生JS对象; //_tmp和result是相互独立的,没有任何联系,…

    2025年3月7日
    200
  • js怎么移除css属性

    js怎么移除css的属性? 在工作中,经常需要使用Javascript来改变页面元素的样式。其中一种办法是改变页面元素的CSS类(Class),这在传统的Javascript里,我们通常是通过处理HTML Dom的classname特性来实…

    2025年3月7日
    200
  • js怎么实现字符串转数组

    js怎么实现字符串转数组? js字符串转数组的函数是”split()“,其用法如下 string.split(separator,limit) 登录后复制 参数值 参数描述separator 可选。字符串或正则表达式,从该参数指定的地方分割…

    2025年3月7日
    200
  • js如何实现页面跳转

    js怎么实现页面跳转? js实现页面跳转可以使用“window.location.href=”跳转地址“”方法; 具体用法如下: 首先创建一个html文件填入以下代码: window.location.href = …

    2025年3月7日
    200

发表回复

登录后才能评论