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 相关文章推荐
Jquery解析json数据详解
Dec 26 Javascript
jquery简单图片切换显示效果实现方法
Jan 14 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
js实现上一页下一页的效果【附代码】
Mar 10 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
详解jQuery的表单验证插件--Validation
Dec 21 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
Vue 实现简易多行滚动"弹幕"效果
Jan 02 Javascript
Vue中keep-alive的两种应用方式
Jul 15 Javascript
基于postman获取动态数据过程详解
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基础知识:类与对象(5) static
2006/12/13 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php实现简单文件下载的方法
2015/01/30 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
JS OffsetParent属性深入解析
2014/01/13 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
详解python和matlab的优势与区别
2019/06/28 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Python属性和内建属性实例解析
2020/01/14 Python
python 回溯法模板详解
2020/02/26 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
尽职尽责村干部自我鉴定
2014/01/23 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
司机岗位职责
2015/02/04 职场文书
城管个人总结
2015/02/28 职场文书
实施意见格式范本
2015/06/05 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
MySQL注入基础练习
2021/05/30 MySQL
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
Redis 异步机制
2022/05/15 Redis