我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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 来临 系列。 查看我的文章:

  • 基于 HTML5 和 Babylon.JS 开发 WebGL 3D 基础

  • 构建单页面应用,基于 ASP.NET 和 AngularJS

  • HTML 高级图像技术

或者我们团队系列:

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

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

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

JavaScript 中怎样创建私有成员

JavaScript 中怎样创建私有成员,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言:面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性和方法只能
2023-06-22

C#中怎么访问私有成员

这期内容当中小编将会给大家带来有关C#中怎么访问私有成员,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有
2023-06-17

java中对象怎么调用成员变量与成员方法

使用对象访问类中的成员:对象名.成员变量;对象名.成员方法();成员变量的默认值:(免费学习视频教程分享:java视频教程)具体实例代码:public class StudentTest_01 { public static void main(Stri
java中对象怎么调用成员变量与成员方法
2021-07-14

怎么在JavaScript中将多个对象合并成一个数组

怎么在JavaScript中将多个对象合并成一个数组?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录