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 相关文章推荐
window.location.hash 属性使用说明
Mar 20 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
node.js发送邮件email的方法详解
Jan 06 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
使用koa2创建web项目的方法步骤
Mar 12 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 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横向重复区域显示二法
2008/09/25 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
asp 取文本框名称代码
2008/12/02 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
js a标签点击事件
2017/03/30 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
独特的python循环语句
2016/11/20 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
解决python 输出是省略号的问题
2018/04/19 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
python学生管理系统开发
2019/01/30 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python异常触发及自定义异常类解析
2019/08/06 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
饲料采购员岗位职责
2013/12/19 职场文书
爱情检讨书大全
2014/01/21 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
毕业生对母校寄语
2015/02/26 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL