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 window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
jquery获取table中的某行全部td的内容方法
Mar 08 Javascript
在页面加载完成后通过jquery给多个span赋值
May 21 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
Vue使用mixins实现压缩图片代码
Mar 14 Javascript
vue :src 文件路径错误问题的解决方法
May 15 Javascript
微信小程序的授权实现过程解析
Aug 02 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
Apr 11 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
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
跟老齐学Python之变量和参数
2014/10/10 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
通过实例学习Python Excel操作
2020/01/06 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
2014学雷锋活动总结
2014/03/09 职场文书
房地产项目建议书
2014/03/12 职场文书
课外小组活动总结
2014/08/27 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
php实例化对象的实例方法
2021/11/17 PHP
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python