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 相关文章推荐
javascript闭包的理解和实例
Aug 12 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
May 02 Javascript
浅谈JSON.parse()和JSON.stringify()
Jul 14 Javascript
vue 不使用select实现下拉框功能(推荐)
May 17 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
May 22 jQuery
微信小程序中this.data与this.setData的区别详解
Sep 17 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
Dec 06 jQuery
微信小程序解析富文本过程详解
Jul 13 Javascript
React Native登录之指纹登录篇的示例代码
Nov 03 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 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的中问验证码
2006/11/25 PHP
收藏的一个php小偷的核心程序
2007/04/09 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP内置加密函数详解
2016/11/20 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
javascript Keycode对照表
2009/10/24 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
vue观察模式浅析
2018/09/25 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
numpy.where() 用法详解
2019/05/27 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
2014年女职工工作总结
2014/11/27 职场文书
赢在执行观后感
2015/06/16 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python