JavaScript面向对象(极简主义法minimalist approach)


Posted in Javascript onJuly 17, 2012

极简主义法

荷兰程序员 Gabor de Mooij 提出了一种比 Object.create ()更好的新方法,他称这种方法为"极简主义法"(minimalist approach)。这也是我推荐的方法。

3. 1 封装

这种方法不使用 this 和 prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因。

首先,它也是用一个对象模拟"类"。在这个类里面,定义一个构造函数 createNew (),用来生成实例。

var Cat = { 
createNew: function (){ 
// some code here 
} 
};

然后,在 createNew ()里面,定义一个实例对象,把这个实例对象作为返回值。

var Cat = { 
createNew: function (){ 
var cat = {}; 
cat.name = "大毛"; 
cat.makeSound = function (){ alert ("喵喵喵"); }; 
return cat; 
} 
};

使用的时候,调用 createNew ()方法,就可以得到实例对象。

var cat1 = Cat.createNew (); 
cat1.makeSound (); // 喵喵喵

这种方法的好处是,容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造,因此可以方便地部署下面的特性。

3. 2 继承

让一个类继承另一个类,实现起来很方便。只要在前者的 createNew ()方法中,调用后者的 createNew ()方法即可。

先定义一个 Animal 类。

var Animal = { 
createNew: function (){ 
var animal = {}; 
animal.sleep = function (){ alert ("睡懒觉"); }; 
return animal; 
} 
};

然后,在 Cat 的 createNew ()方法中,调用 Animal 的 createNew ()方法。

var Cat = { 
createNew: function (){ 
var cat = Animal.createNew (); 
cat.name = "大毛"; 
cat.makeSound = function (){ alert ("喵喵喵"); }; 
return cat; 
} 
};

这样得到的 Cat 实例,就会同时继承 Cat 类和 Animal 类。

var cat1 = Cat.createNew (); 
cat1.sleep (); // 睡懒觉

3. 3 私有属性和私有方法

在 createNew ()方法中,只要不是定义在 cat 对象上的方法和属性,都是私有的。

var Cat = { 
createNew: function (){ 
var cat = {}; 
var sound = "喵喵喵"; 
cat.makeSound = function (){ alert (sound); }; 
return cat; 
} 
};

上例的内部变量 sound,外部无法读取,只有通过 cat 的公有方法 makeSound ()来读取。

var cat1 = Cat.createNew (); 
alert (cat1.sound); // undefined

3. 4 数据共享

有时候,我们需要所有实例对象,能够读写同一项内部数据。这个时候,只要把这个内部数据,封装在类对象的里面、createNew ()方法的外面即可。

var Cat = { 
sound : "喵喵喵", 
createNew: function (){ 
var cat = {}; 
cat.makeSound = function (){ alert (Cat.sound); }; 
cat.changeSound = function (x){ Cat.sound = x; }; 
return cat; 
} 
};

然后,生成两个实例对象:

var cat1 = Cat.createNew (); 
var cat2 = Cat.createNew (); 
cat1.makeSound (); // 喵喵喵

这时,如果有一个实例对象,修改了共享的数据,另一个实例对象也会受到影响。

cat2.changeSound ("啦啦啦"); 
cat1.makeSound (); // 啦啦啦
Javascript 相关文章推荐
实例:尽可能写友好的Javascript代码
Oct 09 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JavaScript学习笔记整理之引用类型
Jan 22 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
Jun 02 Javascript
jQuery文字轮播特效
Feb 12 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
Angular 4.x 路由快速入门学习
May 03 Javascript
react native带索引的城市列表组件的实例代码
Aug 08 Javascript
JavaScript设计模式之构造函数模式实例教程
Jul 02 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
Apr 26 Javascript
ES6基础之 Promise 对象用法实例详解
Aug 22 Javascript
Node.js path模块,获取文件后缀名操作
Nov 07 Javascript
基于jQuery的获取标签名的代码
Jul 16 #Javascript
写自已的js类库需要的核心代码
Jul 16 #Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 #Javascript
js jquery数组介绍
Jul 15 #Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 #Javascript
基于jquery的图片幻灯展示源码
Jul 15 #Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 #Javascript
You might like
基于mysql的bbs设计(五)
2006/10/09 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
JS中递归函数
2016/06/17 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
电子信息毕业生自荐信
2013/11/16 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
个人工作年终总结
2015/03/09 职场文书
行政处罚事先告知书
2015/07/01 职场文书
公历12个月名称的由来
2022/04/12 杂记
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS