如何在JavaScript对象中嵌入私有成员教程.docx

如何在JavaScript对象中嵌入私有成员教程.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如何在JavaScript对象中嵌入私有成员教程

最近,我开发一个项目?Angular Cloud Data Connector, 帮助Angular开发者使用云数据,特别是?Azure移动服务, 使用WEB标准,像索引数据库(indexed DB)。我尝试建立一种方式,使得JavaScript开发者能将私有成员嵌入到一个对象中。 我解决这个问题的技术用到了我命名的闭包空间(closure space)。在这篇入门文章中,我要分享的是如何在你的项目中用它,及它对主流浏览器的性能和内存的影响。 在深入学习前,咱们先说下,你为什么需要用到私有成员(private members), 还有一种替代方式来模拟私有成员。 1. 为何要用私有成员(Private Members) 当你用JavaScript 创建一个对象时,可以声明值成员(value members)。 如果你打算控制对它们的读/写访问操作,可以如下声明: var?entity?=?{}; entity._property?=?hello?world; Object.defineProperty(entity,?property,?{ ????get:?function?()?{?return?this._property;?}, ????set:?function?(value)?{ ????????this._property?=?value; ????}, ????enumerable:?true, ????configurable:?true }); 这样实现,你能完全控制读和写操作。问题在于_property 成员仍然可以直接访问和修改。 这也就是为何我们需要更加稳定可靠的方式,声明私有成员,它智能通过对象的方法来访问。 2. 使用闭包空间(Closure Space) 解决方法是使用闭包空间。每当内部函数 (inner fanction) 访问来自外部函数作用域的变量时,浏览器为你分配一段内存空间。有时很取巧,不过就我们的题目来讲,这算是一个完美的解决方案。 我们在上个代码版本中添加这个特性: var?createProperty?=?function?(obj,?prop,?currentValue)? { ????Object.defineProperty(obj,?prop,? ????{ ????????????get:?function?()?{?return?currentValue;?}, ????????????set:?function?(value)?{ ????????????currentValue?=?value; ????????????????????}, ????????????????????enumerable:?true, ????????????????????configurable:?true????}); ????????????????????}? var?entity?=?{};? var?myVar?=?hello?world;createProperty(entity,?property,?myVar); 示例中,createProperty 函数有一个 currentValue 变量,存在 get 和 set 方法。此变量会保存到 get 和 set 函数的闭包空间中。现在,只有这两个函数能看到和更新?currentValue 变量! 任务完成! 唯一需要警惕 caveat,警告,注意)的是源值 (myVar) 仍可访问。下面给出另一个更健壮的版本(保护 myVar 变量): var?createProperty?=?function?(obj,?prop)?{ ????var?currentValue?=?obj[prop]; ????Object.defineProperty(obj,?prop,?{ ????????get:?function?()?{?return?currentValue;?}, ????????set:?function?(value)?{ ????????????currentValue?=?value; ????????}, ????????enumerable:?true, ????????configurable:?true ????}); } var?entity?=?{ ????property:?hello?world }; createProperty(entity,?property); 采用该函数, 即便源值都销毁(destructed,注:意思是不能直接赋值)了。到此大功告成了! 3.?性能考虑Performance Considerations 现在咱们看看性能。 很明显,比起一个简单的变量,闭包空间,

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档