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 相关文章推荐
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
Nov 17 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
Jun 17 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
node.js 动态执行脚本
Jun 02 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
babel之配置文件.babelrc入门详解
Feb 22 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
google广告之另类js调用实现代码
Aug 22 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
JS 常用校验函数
2009/03/26 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python for循环remove同一个list过程解析
2019/08/14 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
意大利团购网站:Groupon意大利
2016/10/11 全球购物
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
金融专业推荐信
2013/11/14 职场文书
学院书画协会部门职责
2013/11/28 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
就业协议书怎么填
2014/09/15 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
创业计划书之酒店
2019/08/30 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
SQL写法--行行比较
2021/08/23 SQL Server
vue3不同环境下实现配置代理
2022/05/25 Vue.js