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中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
JS 面向对象之神奇的prototype
Feb 26 Javascript
常用的Javascript数据验证插件
Aug 04 Javascript
jquery选择器简述
Aug 31 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
巧用canvas
Jan 21 Javascript
快速实现jQuery多级菜单效果
Feb 01 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
基于JavaScript实现的希尔排序算法分析
Apr 14 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
Aug 16 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 Javascript
js 实现验证码输入框示例详解
Sep 23 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
thinkPHP实现表单自动验证
2014/12/24 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
Python 的 Socket 编程
2015/03/24 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
德国综合购物网站:OTTO
2018/11/13 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
汽车运用工程毕业生自荐信
2013/10/29 职场文书
车间主管岗位职责
2013/11/14 职场文书
统计岗位职责
2014/02/21 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
如何用Navicat操作MySQL
2021/05/12 MySQL
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js