使用ES5实现私有非单例属性
来源:互联网 发布:plc200仿真软件 编辑:程序博客网 时间:2024/06/06 02:16
单例私有属性
咱直接来看代码:
var Person = (function() { var _age_ = 0; function PersonConstructor() {} PersonConstructor.prototype.setAge = function(age) {_age_ = age;} PersonConstructor.prototype.getAge = function() {return _age_;} return PersonConstructor;})();var p1 = new Person();var p2 = new Person();//测试结果console.log(p1.age); // undefinedconsole.log(p2.age); // undefinedconsole.log(p1.getAge()); // 0console.log(p2.getAge()); // 0p1.setAge(12); // 通过p1设置ageconsole.log(p1.getAge()); // 12console.log(p2.getAge()); // 12
从结果中看,可以看出,属性age
无法通过对象名.age
进行访问,只能通过setAge()
和getAge()
进行获取,这就是实现了 私有化属性 的定义;同时也可以看出,p1
和p2
同时共享age
属性,这便是 单例 的。
非单例私有属性
这里的实现主要包括以下几项内容:
- 私有化属性
- 非单例,即每个实例拥有独立的私有化属性
- 同源,即每个示例拥有相同的构造函数和原型,并且
set
和get
方法只定义一次
虽然说起来比较复杂,但是如果换个思路的话,其实很是简单,就在上述示例中进行修改,代码如下所示:
var Person = (function() { var _ages_ = {}; function PersonConstructor() { this.id = new Date().getTime() + Math.floor(Math.random() * 1000); //此处只是测试使用ID,实际生产环境为了避免id重复,可以使用uuid作为唯一标识 } PersonConstructor.prototype.setAge = function(age) { _ages_[this.id] = age; } PersonConstructor.prototype.getAge = function(age) { return _ages_[this.id] || 0; } return PersonConstructor;})();var p1 = new Person();var p2 = new Person();//测试结果console.log(p1.age); // undefinedconsole.log(p2.age); // undefinedconsole.log(p1.getAge()); // 0console.log(p2.getAge()); // 0p1.setAge(12); // 通过p1设置agep1.setAge(13); // 通过p2设置ageconsole.log(p1.getAge()); // 12console.log(p2.getAge()); // 13console.log(p1.__proto__ === p2.__proto__); //trueconsole.log(p1.constructor === p2.constructor); //trueconsole.log(p1.getAge === p2.getAge); //trueconsole.log(p1.setAge === p2.setAge); //true
实现原理:实现原理很是简单,只是将单例情况下的_age_
变为对象_ages_
,并且在每个对象创建时分配一个唯一标识id
,在对age
属性操作时,实际是对_ages_
对象中对应id
的属性进行操作,便可满足要求。
可能存在问题
在本例中使用了javascript
中 闭包 的概念,因此便会涉及到 垃圾回收机制 的问题,此处暂未做测试,若有兴趣的读者可自行进行试验,在所有实例都已销毁的情况下,对象_ages_
的存在情况。
阅读全文
0 0
- 使用ES5实现私有非单例属性
- javascript实现私有属性私有方法
- 实现javaScript对象属性私有
- 使用 Mockito 修改私有属性
- javascript实现私有属性与实例属性
- 多使用公共属性,而不是私有属性
- 使用Webpack ES6转ES5 实现模块化(import export)
- javascript中私有属性的实现。
- pb中实现使用属性(property)访问类的私有字段
- pb中实现使用属性(property)访问类的私有字段
- 使用私有构造函数强化singleton属性
- 使用反射调用私有属性和方法
- 【css】浏览器私有属性前缀使用详解
- 私有属性
- Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值
- es5--js实现对象注册
- javascript es5利用闭包特性形成私有方法
- es5
- MySQL 字符串截取函数
- Caffe MNIST训练lenet网络
- 关于C#线程中使用定时器timer无效
- tcc-transaction分布式TCC型事务框架搭建与使用记录
- tensorflow分布式运行时组件剖析
- 使用ES5实现私有非单例属性
- maven命令安装第三方jar包到本地仓库和私服
- Spring Boot学习(七)之Web应用使用jdbctemplate多数据源配置
- 关联容器的应用(一)
- Socket 编程
- linux系统常见的压缩命令
- 设计模式(四)——代理模式
- 分布式网站架构学习资源
- 分布式事务的典型处理方式:2PC、TCC、异步确保和最大努力型