- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>
- </title>
- </head>
- <body>
- <script>
- /*
- * 信息的隐藏是最终的目的, 封装只不过是隐藏的一种方法
- */
- function demo1() { (function() {
- /* 类的定义形式:
- * 1. 门户大开类型
- * 2. 命名规范区别私有和公有方式
- * 3. 闭包
- *$/ 门户大开型
- function Person(age, name) {
- this.name = name;
- if (!this.checkAge(age)) {
- throw new Error("年龄必须在 0-150 之间")
- }
- this.age = age;
- }
- // var p = new Person(-10,"jim");
- // alert(p.name+" "+p.age); // 年龄 - 10, 不符合常规
- // 解决上述问题
- Person.prototype = {
- checkAge: function(age) {
- if (age>= 0 && age <150) {
- return true
- } else {
- return false;
- }
- }
- };
- Person.prototype["getName"] = function() {
- return this.name || "javascript.com"
- }
- // var p = new Person(-10,"jim");
- // alert(p.name+" "+p.age);
- // 读取规则的验证
- var p2 = new Person(27);
- alert(p2.getName() + " " + p2.age);
- })()
- }
- // 用命名规范来区别私有和公有变量
- function demo2() { (function() {
- function Person(name, age, email) {
- // 定义私有变量
- this._name;
- this._age;
- this.setName(name);
- this.setAge(age);
- this.emial = email;
- }
- Person.prototype = {
- setName: function(name) {
- this._name = name;
- },
- setAge: function(age) {
- if (age>= 0 && age <150) {
- this._age = age;
- } else {
- throw new Error("年龄必须在 0-150 之间")
- }
- }
- };
- var p = new Person("jim", 1, "张丹");
- })();
- }
- // 闭包实现封装
- function demo3() { (function() {
- function Person(name, age, email, sex) {
- this.email = email;
- //get
- this.getName = function() {
- return this.name;
- }
- this.getAge = function() {
- return this.age;
- }
- //set
- this.setName = function(name) {
- this.name = name;
- }
- this.setAge = function(age) {
- if (age>= 0 && age <150) {
- this.age = age;
- } else {
- throw new Error("年龄必须在 0-150 之间")
- }
- };
- var _sex = "M"; // 这也是私有变量的编写方式
- this.getSex = function() {
- return _sex;
- }
- this.setSex = function(sex) {
- _sex = sex;
- }
- this.init = function() {
- this.setName(name);
- this.setAge(age);
- }
- this.init();
- }
- var p = new Person("jim", -1, "xxxx@qq.com")
- })();
- }
- // 静态化
- (function() {
- /*
- * 普通的属性和函数是作用在对象上的
- * 静态函数是定义到类上的
- */
- function Person(name, age) {
- this.name = name;
- this.showName = function() {
- alert(this.name);
- }
- }
- // 第一种静态函数的写法
- Person.add = function(x, y) {
- return x + y
- }
- //alert(Person.add(1,3))
- // 第二种方式: 用类中类的方式完成每一个对象全拥有相同的属性和函数
- var cat = (function() {
- // 私有静态属性
- var AGE = 10;
- // 私有函数
- function add(x, y) {
- return x + y
- }
- return function() {
- this.AGE = AGE;
- this.add = function(x, y) {
- return add(x, y);
- }
- this.setAge = function(age) {
- AGE = age; // 这个可以设置成功, 但只对以后创建实例的初始化有效
- }
- }
- })() alert(new cat().add(1, 2) + " " + new cat().AGE);
- new cat().setAge(20); // 这个可以设置成功, 但只对以后创建实例的初始化有效
- alert(new cat().AGE);
- })();
- /*
- * 1. 保护内部数据的完整性是封装一大用处
- * 2. 对象的重构变得很轻松,(可以动态化变更部分代码)
- * 3. 弱化模块之间的耦合
- * 弊端: 私有的方法会变得很难进行单元测试, 使用封装就意味着与复杂的代码打交道
- * 最大的问题: 封装在 javascript 是很难实现的
- */
- </script>
- </body>
- </html>
来源: http://www.qdfuns.com/article/40858/0e69b78b5efd456c01654df35bccf17b.html