位置: 编程技术 - 正文

你的 mixin 真的兼容 ECMAScript 5 吗?(你miu的)

编辑:rootadmin

我最近在与客户合作的项目中,需要充分利用的 ECMAScript 5,在此我遇到一个非常有趣的问题。 该问题源于一个非常常见的模式: mixin , 也就是在 JavaScript 中把一个对象的属性或者方法 mixin 到另一个。

大多数 mixin 的功能看起来像这样:

在此 mixin() 函数中,一个 for 循环遍历 supplier 对象的属性并赋值给 receiver 对象。 几乎所有的 JavaScript 库有某种形式的类似功能,让您可以编写这样的代码:

在此示例中,object 对象接收了属性 name 和方法 sayName()。 这在 ECMAScript 3 中运行良好,但在 ECMAScript 5 上却没那么乐观。

这是我遇到的问题:

这个例子看起来有点做作,但它准确的描述这个问题。 进行 mixin 的属性使用了 ECMAScript 5 的新特性:一个 getter 属性存取器。 getter 引用一个未初始化的局部变量 name,因此这个属性未定义 undefined。

后来,name 被分配了一个值,以便使存取器 getter 可以返回一个有效的值。 不幸的是,object.name(被 mixin 的属性)始终返回 undefined。

这是怎么回事呢?

我们仔细分析 mixin() 函数。 事实上,在循环语句中,并没有把属性从一个对象重新赋值给到另一个对象。 它实际上是创建一个同名的属性,并把 supplier 对象的存取器方法 getter 的返回值赋值给了它。 (译注:目标对象得到的不是 getter 这个方法,而是得到了 getter 方法的返回值。@justjavac)

在这个例子中,mixin() 的过程其实是这样的:

属性 receiver.name 被创建,并且被赋值为 supplier.name 的值。 当然,supplier.name 有一个 getter 方法用来返回本地变量 name 的值。 此时,name 的值为 undefined,所以 receiver.name 存储的是 值。 并没有为 receiver.name 创建一个 getter 方法,因此它的值永远不会改变。

要解决这个问题,你需要使用属性描述符(译注:descriptor)将属性从一个对象 mixin 到另一个对象。 一个纯粹的 ECMAScript 5 版本的 mixin() 应该这样写:

在这个新版本函数中,Object.keys() 用来获取一个数组,包含了 supplier 对象的所有枚举属性。 然后,foreach() 方法用来遍历这些属性。 调用 Object.getOwnPropertyDescriptor() 方法获取 supplier 对象的每个属性描述符(descriptor)。

由于描述符(descriptor)包含了所有的属性信息,包括 getter 和 setter 方法, 该描述符(descriptor)可以直接传递给 Object.defineProperty() ,用来在 receiver 对象上创建相同的属性。 使用这个新版本的 mixin() ,可以解决前面遇到的问题,从而得到你所期望的结果。 getter 方法被正确地从 supplier 传递到了 receiver。

当然,如果你仍然需要支持旧的浏览器,那么你就需要一个函数,回落的 ECMAScript 3:

如果您需要使用一个 mixin() 函数,一定要仔细检查它在 ECMAScript 5 可以正常工作,特别是 getter 和 setter 方法。 否则,你会发现自己陷入像我一样的错误。

推荐整理分享你的 mixin 真的兼容 ECMAScript 5 吗?(你miu的),希望有所帮助,仅作参考,欢迎阅读内容。

你的 mixin 真的兼容 ECMAScript 5 吗?(你miu的)

文章相关热门搜索词:你的niki,你的name,你miu的,你的mr,你的ms,你miu的,你的niki,你miu的,内容如对您有帮助,希望把文章链接给更多的朋友!

在javascript中关于节点内容加强 一、元素节点//测试元素节点,输出节点名称,节点的类型,节点的值varliElements=document.getElementsByTagName("li");for(vari=0;iliElements.length;i++){alert(liElements[i].nodeName)

在javascript中对于DOM的加强 一、DOMDOM:DOM=DocumentObjectModel,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一

javascript标签在页面中的位置探讨 在制作网页的过程中,我们经常写类似下面的代码:[html]htmlheadtitleExampleHTMLPage/titlescripttype="text/javascript"src="example1.js"/scriptscripttype="text/javascript"src="exampl

标签: 你miu的

本文链接地址:https://www.jiuchutong.com/biancheng/377657.html 转载请保留说明!

上一篇:谈谈关于JavaScript 中的 MVC 模式(谈谈关于中华文明的五个突出特性)

下一篇:在javascript中关于节点内容加强(在javascript中关于alert confirm)

  • 电子税务局财务报表怎么更正申报
  • 待认证进项税额和待抵扣进项税额的区别
  • 带薪年休假如果当年离职补交的年休假钱需要扣个税嘛
  • 工厂房租没有发票怎么办
  • 会计运费怎么算的
  • 商务费用报销一般有哪些流程
  • 打包材料的费用会计分录
  • 临时税务登记可以开发票吗
  • 企业所得税汇算清缴账务处理
  • 代交社保费会计账务处理
  • 单位买另一单位银行承兑汇怎样入账?
  • 加工成本属于什么会计科目
  • 金碟系统操作
  • 行政事业单位工会经费支出范围
  • 企业预缴所得税的比例要求
  • 红字发票交税吗
  • 税控系统技术维护费抵扣如何填报
  • 实收资本印花税申报期限
  • 企业被列为风险纳税人税控开票会显示什么
  • 企业注销时留抵税额怎么做账
  • 小微企业免征增值税优惠
  • 合伙企业收到的合伙金计入什么科目
  • 待摊费用核算的内容主要包括
  • 进口货物需要缴纳教育费附加
  • 摊销费用多做如何做账?
  • 现在还有短期投资这个科目吗
  • 政府购买缴纳社保吗
  • 工程在建期间土地税滞纳金
  • 薪酬总额包干什么意思
  • 增值税补开发票
  • 其他应付款在现金流量表怎么填
  • 税收风险应对措施包括
  • 核定征收的小规模纳税人要做账吗
  • windows server 2016 配置web网页
  • 二手房印花税怎么算2020
  • 所得税税前扣除的费用有哪些
  • php image
  • 餐饮发票可以计入福利费吗
  • 接受母公司捐赠无协议约定
  • 云原生istio
  • 哪些服务可以开具经纪代理服务发票
  • 建筑保温材料出台了哪些限制政策
  • 邮寄的发票对方没收到怎么办
  • 母公司的资质怎样才能转给子公司
  • 深入理解linux内核
  • RedHat6.5/CentOS6.5安装Mysql5.7.20的教程详解
  • 商品流通企业的含义
  • 收据可以当发票吗?
  • sql service 2008 数据库还原
  • 附加税费怎么计算
  • 其他综合收益的概念
  • 弥补亏损的会计科目有哪些
  • 如果返利冲抵货款怎么办
  • 财务报表的勾稽关系结构图
  • 工程预付税金如何计算
  • 收到银行回单如何打印
  • 委托加工农产品的扣除率
  • 外贸出口退税政策
  • 买二手办公用品
  • 公司买空调算什么费用
  • 互联网代记账业务
  • win10安装mysql5.6
  • mysql5.7bug
  • smagent.exe - smagent是什么进程
  • 删除xp本地保存的视频
  • Linux下通过script 命令记录(数据库)操作步骤
  • windows8怎么新建word文档
  • win8.1其他用户名登不进去
  • win7怎么设置局域网共享文件和操作
  • python错误代码
  • Android使用HttpURLConnection和HttpClient请求服务器数据
  • python的爬虫技术
  • js中写html代码
  • 安卓新安装包
  • js进阶视频教程
  • js dom操作方法
  • python flask框架 web服务器
  • 税务局执法不规范整改
  • 如何查询契税是否逾期
  • 广东2020医保缴费要多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设