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 相关文章推荐
jQuery编写widget的一些技巧分享
Oct 28 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
Sep 05 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
鼠标经过出现气泡框的简单实例
Mar 17 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 Javascript
基于Vue中的父子传值问题解决
Jul 27 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
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
在vscode中配置python环境过程解析
2019/09/28 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
python爬取youtube视频的示例代码
2021/03/03 Python
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
民族团结先进个人材料
2014/02/05 职场文书
机关节能减排实施方案
2014/03/17 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
小学亲子活动总结
2014/07/01 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
话题作文之成长
2019/12/09 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS