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 相关文章推荐
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
May 30 Javascript
javascript 学习笔记(八)javascript对象
Apr 12 Javascript
动态加载script文件的两种方法
Aug 15 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
jQuery实现网站添加高亮突出显示效果的方法
Jun 26 Javascript
Jquery uploadify上传插件使用详解
Jan 13 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
Jan 26 Javascript
什么是Vue.js框架 为什么选择它?
Oct 17 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
Aug 08 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 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保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
itchat接口使用示例
2017/10/23 Python
Python 元类实例解析
2018/04/04 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
小学毕业感言50字
2014/02/16 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
毕业生学校组织意见
2015/06/04 职场文书
预备党员入党感想
2015/08/10 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书