functional继承模式 摘自javascript:the good parts


Posted in Javascript onJune 20, 2011

这种模式的作用在于确保对象属性的真正私有化, 我们无法直接访问对象的状态, 只能通过特权方法来进行操作.
下面直接来个例子吧.

var person = function(cfg) { 
var that = {}; 
that.getName = function() { 
return cfg.name || 'unknow name'; 
}; 
// 性别 默认男性 
that.getGender = function() { 
return cfg.gender || 'male'; 
}; 
return that; 
}; 
var programmer = function(cfg) { 
var that = person(cfg), 
share = {}; 
share.status = 'normal'; 
that.getFamiliarLanguage = function() { 
return (cfg.langs || []).join(' '); 
}; 
that.getProfile = function() { 
return 'hi,my name is ' + that.getName(); 
}; 
that.getStatus = function() { 
return share.status; 
}; 
that.setStatus = function(status) { 
share.status = status; 
}; 
return that; 
}; 
var me = programmer({ 
name: 'AndyZhang', 
gender: 'male', 
// 熟悉的语言 
langs: ['javascript', 'java', 'php'] 
}); 
console.debug(me.getFamiliarLanguage()); 
console.debug(me.getProfile()); 
me.setStatus('oh really busy..'); 
console.debug(me.getStatus());

从代码中可以看到,我们调用programmer方法时,没用使用new, 而且方法里也没有出现this关键字.
如果出现类似this.name = cfg.name这样的属性赋值代码, 再用new去调用(构造函数调用方式),这样产生的对象的name属性就不再私有.如:
// 这里方法名的首字母大写 以表示作为一个构造方法 用new来调用 
var Person = function(cfg) { 
this.name = cfg.name; 
this.gender = cfg.gender; 
} 
// new出一个person1 
var person1 = new Person({ 
name: 'Andrew', 
gender: 'male' 
}); 
// 本来是想让name, gender成为私有 用类似setter getter方法来读写 就像javaBean一样 
alert(person1.name); // 'Andrew' 
alert(person1.gender); // 'male'

从上面的例子可以看出person1的属性我们是可以直接访问的,没有做到真正的private. 有时候我们会用代码规范或约定来表示我们定义的某个属性是私有的,比如this._name用这样的写法表示name属性是私有的. 个人觉得只要约定统一,这也是一种不错的方式, 在第三方js库中,这种运用的可能比较多,像YUI2
继续看最开始的代码, 没有用到this, 而是用了that作为载体, 从programmer方法中我们看到that所起到的作用, 调用person后,返回的that已经具有了person所具有的方法getName, getGender, 然后我们根据programmer具体的需要在that基础上进行扩展, 当然也可以覆写原来的方法, programmer中的share可以用来集中一些私有变量和方法, 通过javascript的scope和closure机制, 可以在that扩展的方法中对它们进行处理和调用, 比如代码中的that.getStatus和that.setStatus方法, 最后return that.
Javascript 相关文章推荐
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
JavaScript 获取任一float型小数点后两位的小数
Jun 30 Javascript
Javascript遍历table中的元素示例代码
Jul 08 Javascript
JS实现下拉菜单赋值到文本框的方法
Aug 18 Javascript
jQuery实现Tab选项卡切换效果简单演示
Nov 23 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
AngularJS模仿Form表单提交的实现代码
Dec 08 Javascript
很棒的vue弹窗组件
May 24 Javascript
vue父子组件通信的高级用法示例
Aug 29 Javascript
关于layui表单中按钮自动提交的解决方法
Sep 09 Javascript
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 Javascript
jQuery数组处理方法汇总
Jun 20 #Javascript
jQuery UI AutoComplete 使用说明
Jun 20 #Javascript
jQuery 源码分析笔记(3) Deferred机制
Jun 19 #Javascript
jQuery 源码分析笔记(7) Queue
Jun 19 #Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 #Javascript
jQuery调用WebService的实现代码
Jun 19 #Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 #Javascript
You might like
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
php Calender(日历)代码分享
2014/01/03 PHP
php验证码生成器
2017/05/24 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
layui select动态添加option的实例
2018/03/07 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
用python代码做configure文件
2014/07/20 Python
使用PDB模式调试Python程序介绍
2015/04/05 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
高级护理实习生自荐信
2013/09/28 职场文书
网络工程师的自我评价
2013/10/02 职场文书
学生自我鉴定范文
2013/10/04 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
保险内勤岗位职责
2015/04/13 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python