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 相关文章推荐
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
Sep 16 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
bootstrap table插件的分页与checkbox使用详解
Jul 23 Javascript
js实现九宫格抽奖
Mar 19 Javascript
浅析JavaScript 函数柯里化
Sep 08 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导出word格式数据的代码实例
2013/11/25 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
javascript编程起步(第六课)
2007/01/10 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
介绍Python中的文档测试模块
2015/04/28 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
python抓取百度首页的方法
2015/05/19 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
python序列化与数据持久化实例详解
2019/12/20 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
python实现飞机大战项目
2020/03/11 Python
python绘制分布折线图的示例
2020/09/24 Python
法学专业应届生求职信
2013/10/16 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
社区先进事迹材料
2014/05/19 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
go xorm框架的使用
2021/05/22 Golang