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 个人笔记(没有整理,很乱)
Jul 07 Javascript
jquery ajax提交表单数据的两种实现方法
Apr 29 Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 Javascript
JS嵌套函数调用上下文的问题解决
Mar 26 Javascript
canvas实现图像截取功能
Feb 06 Javascript
Express URL跳转(重定向)的实现方法
Apr 07 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
JavaScript实现身份证验证代码实例
Aug 26 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
jQuery ajax - getScript() 方法和getJSON方法
May 14 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 地址栏信息的获取代码
2009/01/07 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
javascript 闭包疑问
2010/12/30 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
python获取图片颜色信息的方法
2015/03/18 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
深入学习python的yield和generator
2016/03/10 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
python实现梯度下降法
2020/03/24 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
四好少年事迹材料
2014/01/12 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
《植树问题》教学反思
2016/03/03 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
nginx容器方式反向代理实战
2022/04/18 Servers