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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
JavaScript学习笔记之DOM基础 2.4
Aug 14 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
Apr 29 Javascript
浅析angularJS中的ui-router和ng-grid模块
May 20 Javascript
原生和jQuery的ajax用法详解
Jan 23 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
jquery插件实现代码雨特效
Apr 24 jQuery
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实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
JS变量及其作用域
2017/03/29 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python全局变量操作详解
2015/04/14 Python
六个窍门助你提高Python运行效率
2015/06/09 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
详解python中的index函数用法
2019/08/06 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Structs界面控制层技术
2013/10/11 面试题
小学生秋游活动方案
2014/02/23 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
房屋授权委托书范本
2014/10/07 职场文书
工作年限证明模板
2015/06/15 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python