iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript 对象中怎么嵌入私有成员
  • 446
分享到

JavaScript 对象中怎么嵌入私有成员

2024-04-02 19:04:59 446人浏览 安东尼
摘要

javascript 对象中怎么嵌入私有成员,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 为何要用私有成员(Private Memb

javascript 对象中怎么嵌入私有成员,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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

现在咱们看看性能。

很明显,比起一个简单的变量,闭包空间,甚或(对象)属性要慢的多,且更消耗资源。这就是本文更多关注普通方式和闭包空间机制差异的原因。

为证明闭包空间机制并不比标准方式更消耗资源, 我写了下面代码做个基准测试

<!DOCTYPE html> <html xmlns="Http://www.w3.org/1999/xhtml"> <head>     <title></title> </head> <style>     html {         font-family: "Helvetica Neue", Helvetica;     } </style> <body>     <div id="results">Computing...</div>     <script>         var results = document.getElementById("results");         var sampleSize = 1000000;         var opCounts = 1000000;          var entities = [];          setTimeout(function () {             // Creating entities             for (var index = 0; index < sampleSize; index++) {                 entities.push({                     property: "hello world (" + index + ")"                 });             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML = "<strong>Results:</strong><br>Using member access: <strong>" + (end - start) + "</strong> ms";         }, 0);          setTimeout(function () {             // Closure space =======================================             var createProperty = function (obj, prop, currentValue) {                 Object.defineProperty(obj, prop, {                     get: function () { return currentValue; },                     set: function (value) {                         currentValue = value;                     },                     enumerable: true,                     configurable: true                 });             }             // Adding property and using closure space to save private value             for (var index = 0; index < sampleSize; index++) {                 var entity = entities[index];                  var currentValue = entity.property;                 createProperty(entity, "property", currentValue);             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML += "<br>Using closure space: <strong>" + (end - start) + "</strong> ms";         }, 0);          setTimeout(function () {             // Using local member =======================================             // Adding property and using local member to save private value             for (var index = 0; index < sampleSize; index++) {                 var entity = entities[index];                  entity._property = entity.property;                 Object.defineProperty(entity, "property", {                     get: function () { return this._property; },                     set: function (value) {                         this._property = value;                     },                     enumerable: true,                     configurable: true                 });             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML += "<br>Using local member: <strong>" + (end - start) + "</strong> ms";         }, 0);      </script> </body> </html>

我创建了一百万个对象,都有属性成员。要完成下面三个测试:

  • 执行 1百万次随机访问属性。

  • 执行1百万次随机访问闭包空间实现版本。

  • 执行1百万次随机访问常规get/set实现版本。

测试结果参见下面表格和图表:

JavaScript 对象中怎么嵌入私有成员

JavaScript 对象中怎么嵌入私有成员

我们发现,闭包空间实现总是快于常规实现,根据浏览器的不同,还可以做进一步的性能优化

Chrome 上的性能表现低于预期。或许存在 bug,因此,为确认(存在 bug),我联系了 Google 项目组,描述发生的症状。还有,如果你打算测试在 Microsoft Edge &mdash;微软新发布的浏览器,在windows10 中默认安装&mdash;中的性能表现,你可以点击下载 。

然而,如果仔细研究,你会发现,使用闭包空间或属性比直接访问变量成员要10倍左右。 因此,使用要恰当且谨慎。

JavaScript 对象中怎么嵌入私有成员

4. 内存占用(Memory Footprint)

我们也得验证该技术不会消耗过多内存。为测试内存占用基准情况,我写了下面代码段:

直接属性引用版本(Reference Code)

var sampleSize = 1000000;  var entities = [];  // Creating entities for (var index = 0; index < sampleSize; index++) {     entities.push({             property: "hello world (" + index + ")" });}  常规方式版本(Regular Way,get/set)  var sampleSize = 1000000;  var entities = [];  // Adding property and using local member to save private value for (var index = 0; index < sampleSize; index++) {     var entity = {};      entity._property = "hello world (" + index + ")";     Object.defineProperty(entity, "property", {         get: function () { return this._property; },         set: function (value) {             this._property = value;         },         enumerable: true,         configurable: true     });      entities.push(entity); }  闭包空间版本(Closure Space Version)  var sampleSize = 1000000;  var entities = [];  var createProperty = function (obj, prop, currentValue) {     Object.defineProperty(obj, prop, {         get: function () { return currentValue; },         set: function (value) {             currentValue = value;         },         enumerable: true,         configurable: true     }); }  // Adding property and using closure space to save private value for (var index = 0; index < sampleSize; index++) {     var entity = {};      var currentValue = "hello world (" + index + ")";     createProperty(entity, "property", currentValue);      entities.push(entity); }

之后,我(在三个主流浏览器上)运行所有的三段代码,启动(浏览器)内嵌的内存性能分析器(本示例中使用 F12 工具条):

JavaScript 对象中怎么嵌入私有成员

我计算机上运行的结果如下图表:

JavaScript 对象中怎么嵌入私有成员

就闭包空间和常规方式,只有 Chrome上,闭包空间(内存占用)表现稍好,在 IE11 和 Firefox上占用内存反而增多,但是浏览器的比较结果e&mdash;对于现代浏览器,用户很可能不会在意这点差别。

更多 JavaScript 实践

或许你会吃惊,微软提供了一批有关开源 Javascript 主题的免费学习材料, 我们正在发起一个任务,关于创建更多 Microsoft Edge 来临 系列。 查看我的文章:

或者我们团队系列:

  • HTML/JavaScript 性能优化使用技巧 (该系列有7部分,从响应式设计到休闲游戏的性能优化)

  • 现代 WEB 平台快速起步 ( HTML, CSS, and JS基础)

  • 开发通用的 Windows Apps,使用 HTML 和 JavaScript 快速起步 (使用你自己的JS构建app)

关于JavaScript 对象中怎么嵌入私有成员问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网html频道了解更多相关知识。

--结束END--

本文标题: JavaScript 对象中怎么嵌入私有成员

本文链接: https://www.lsjlt.com/news/77701.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript 对象中怎么嵌入私有成员
    JavaScript 对象中怎么嵌入私有成员,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 为何要用私有成员(Private Memb...
    99+
    2024-04-02
  • JavaScript 中创建私有成员
    目录1.使用闭包2.使用 ES6 类3.使用 ES2020 提案4.使用 WeakMap5.使用 TypeScript前言: 面向对象编程语言中的 private 关键字是一个访问修...
    99+
    2024-04-02
  • JavaScript 中怎样创建私有成员
    JavaScript 中怎样创建私有成员,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言:面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性...
    99+
    2023-06-22
  • Javascript中怎么实现一个私有成员
    这篇文章给大家介绍Javascript中怎么实现一个私有成员,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Javascript中闭包的特性,从而彻底解决了Javascript私有成员的...
    99+
    2024-04-02
  • Javascript中的私有成员是什么意思
    这篇文章主要介绍“Javascript中的私有成员是什么意思”,在日常操作中,相信很多人在Javascript中的私有成员是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • JavaScript中私有成员的作用是什么
    这期内容当中小编将会给大家带来有关JavaScript中私有成员的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。class BaseView ...
    99+
    2024-04-02
  • C#中怎么访问私有成员
    这期内容当中小编将会给大家带来有关C#中怎么访问私有成员,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有...
    99+
    2023-06-17
  • VB.NET对象成员有什么用
    这篇文章主要介绍了VB.NET对象成员有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对象是面向对象的编程中的基本单位。一个对象就是应用程序的一个元素,代表类的一个“实...
    99+
    2023-06-17
  • Javascript中面向对象程序设计对象成员的示例分析
    小编给大家分享一下Javascript中面向对象程序设计对象成员的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!序:刚接...
    99+
    2024-04-02
  • JavaScript中window对象的成员属性实例分析
    这篇文章主要介绍“JavaScript中window对象的成员属性实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中window对象的成员...
    99+
    2024-04-02
  • javascript怎么嵌入html中
    这篇“javascript怎么嵌入html中”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2024-04-02
  • python封装中私有成员指的是什么
    这篇文章将为大家详细讲解有关python封装中私有成员指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • Spring成员对象注入的三种方式是什么
    本篇内容主要讲解“Spring成员对象注入的三种方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring成员对象注入的三种方式是什么”吧!当一个类运行需要调用一个成员对象,成员对象也...
    99+
    2023-06-29
  • Java怎么通过反射获取私有构造、私有对象、私有字段、私有方法
    这篇文章主要介绍了Java怎么通过反射获取私有构造、私有对象、私有字段、私有方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java反射获取私有构造、私有对象、私有字段、私...
    99+
    2023-06-22
  • 怎么将JavaScript嵌入HTML文件中
    本篇内容主要讲解“怎么将JavaScript嵌入HTML文件中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么将JavaScript嵌入HTML文件中”吧! ...
    99+
    2024-04-02
  • 使用python怎么检查类和对象的成员
    这期内容当中小编将会给大家带来有关使用python怎么检查类和对象的成员,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,P...
    99+
    2023-06-14
  • JavaScript中localStorage对象有什么用
    本篇内容介绍了“JavaScript中localStorage对象有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2024-04-02
  • JavaScript中Date对象有什么用
    这篇文章主要为大家展示了“JavaScript中Date对象有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中Date对象有什么用”这...
    99+
    2024-04-02
  • JavaScript中怎么定义对象
    本篇文章给大家分享的是有关JavaScript中怎么定义对象,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、JavaScript对象的定义J...
    99+
    2024-04-02
  • JavaScript中怎么创建对象
    小编给大家分享一下JavaScript中怎么创建对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ECMA-262把对象定义为:...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作