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对select动态添加和删除OPTION示例代码
Aug 12 Javascript
js单词形式的运算符
May 06 Javascript
js 动态修改css文件用到了cssRule
Aug 20 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
Mar 16 Javascript
Javascript中神奇的this
Jan 20 Javascript
Node.js的Express框架使用上手指南
Mar 12 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
Jul 18 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
浅谈React高阶组件
Mar 28 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
为什么node.js不适合大型项目
Apr 28 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
德生PL330测评
2021/03/02 无线电
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
ThinkPHP5框架缓存查询操作分析
2018/05/30 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
jQuery动态添加
2016/04/07 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
js实现图片360度旋转
2017/01/22 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
python实现字符串和字典的转换
2018/09/29 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python线程threading模块用法详解
2020/02/26 Python
Python count函数使用方法实例解析
2020/03/23 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
人事主管的岗位职责
2013/11/16 职场文书
社区综治工作汇报
2014/10/27 职场文书
个人优缺点总结
2015/02/28 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
z-index不起作用
2021/03/31 HTML / CSS