JS 设计模式--以闭包的方式封装
2017-09-01 09:28
435 查看
var Person = (function () { //静态方法(共享方法) var checkNo = function (no) { if (!no.constructor == "string" || no.length != 4) throw new Error("学号必须为4位"); }; //静态变量(共享变量) var times = 0; //return the constructor. return function (no, name, age) { console.log(times++); // 0 ,1 , 2 var no , name , age; //私有变量 this.setNo = function (no) //私有方法 { checkNo(no); this._no = no; }; this.getNo = function () { return this._no; } this.setName = function (name) { this._name = name; } this.getName = function () { return this._name; } this.setAge = function (age) { this._age = age; } this.getAge = function () { return this._age; } this.setNo(no); this.setName(name); this.setAge(age); } })(); Person.prototype = { constructor: Person, toString: function () { return "no = " + this._no + " , name = " + this._name + " , age = " + this._age; } }; var p1 = new Person("0001", "小平果", "22"); var p2 = new Person("0002", "abc", "23"); var p3 = new Person("0003", "aobama", "24"); console.log(p1.toString()); //no = 0001 , name = 小平果 , age = 22 console.log(p2.toString()); //no = 0002 , name = abc , age = 23 console.log(p3.toString()); //no = 0003 , name = aobama , age = 24
上述代码,js引擎加载完后,会直接执行Person = 立即执行函数,然后此函数返回了一个子函数,这个子函数才是new Person所调用的构造函数,又因为子函数中保持了对立即执行函数中checkNo(no) ,times的引用,(很明显的闭包)所以对于checkNo和times,是所有Person对象所共有的,创建3个对象后,times分别为0,1,2 。这种方式的好处是,可以使Person中需要复用的方法和属性做到私有且对象间共享。
这里的私用成员和特权成员仍然被声明在构造器。但那个构造器却从原来的普通函数变成了一个内嵌函数,并且被作为包含它的函数的返回值给变量Person。这就创建了一个闭包,你可以把静态的私用成员声明在里面。位于外层函数声明之后的一对空括号很重要,其作用是代码一载入就立即执行这个函数。这个函数的返回值是另一个函数,它被赋给Person变量,Person因此成了一个构造函数。在实例华Person时,所调用的这个内层函数。外层那个函数只是用于创建一个可以用来存储静态成员的闭包。
在本例中,checkno被设计成为静态方法,原因是为Person的每个实例都生成这个方法的一个新副本毫无道理。此外还有一个静态属性times,其作用在于跟踪Person构造器的总调用次数。
相关文章推荐
- 【js设计模式笔记---封装】
- 【js设计模式笔记---封装】
- js设计模式之迭代器模式学习笔记--封装简单的数组迭代器
- JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
- js 单例模式的实现方式----闭包和构造函数内部判断
- 设计模式知识连载(3)---封装_2:闭包
- js原生设计模式——2面向对象编程之继承—原型继承(类式继承的封装)
- js原生设计模式——7原型模式之真正的原型模式——对象复制封装
- js原生设计模式——9外观模式封装
- JavaScript进阶设计模式系列——基础篇——闭包(5)--命令模式的两种实现方式
- js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
- js 闭包方式封装
- js原生设计模式——9外观模式封装2(小型代码库YJ)
- 【JS 设计模式 】用单例模式(Singleton)来封装对数据的增删除改查
- JS设计模式——3.封装与信息隐藏
- js原生设计模式——2面向对象编程之闭包1
- js设计模式-封装
- js原生设计模式——2面向对象编程之闭包2
- JS设计模式——1.富有表现力的JS
- js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)