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 相关文章推荐
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
jQuery网页选项卡插件rTabs用法实例分析
Aug 26 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
Dec 07 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
JS使用iView的Dropdown实现一个右键菜单
May 06 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
微信公众号生成新浪短网址的实现(快速生成)
Aug 18 Javascript
ES6学习笔记之let与const用法实例分析
Jan 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
用PHP来写记数器(详细介绍)
2006/10/09 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
js玩一玩WSH吧
2007/02/23 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
python中的句柄操作的方法示例
2019/06/20 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
土木工程毕业生自荐信
2013/11/12 职场文书
英文自荐信常用句子
2014/03/26 职场文书
亲子活动总结
2014/04/26 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2016年元旦寄语
2015/08/17 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript