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 相关文章推荐
JS 按钮点击触发(兼容IE、火狐)
Aug 07 Javascript
html向js方法传递参数具体实现
Aug 08 Javascript
使用js对select动态添加和删除OPTION示例代码
Aug 12 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
原生JS实现匀速图片轮播动画
Oct 18 Javascript
详解jQuery中的DOM操作
Dec 23 Javascript
详解Angular2 之 结构型指令
Jun 21 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
基于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
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
质检员的岗位职责
2013/11/15 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
廉政承诺书范文
2015/04/28 职场文书
python多线程方法详解
2022/01/18 Python
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js