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实现div拖拽宽度示例代码
Jul 31 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
Sep 29 Javascript
AngularJS页面带参跳转及参数解析操作示例
Jun 28 Javascript
javascript实现数字配对游戏的实例讲解
Dec 14 Javascript
JS处理一些简单计算题
Feb 24 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
Aug 14 jQuery
validform表单验证的实现方法
Mar 08 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
Apr 17 Javascript
js对象数组和对象的使用实例详解
Aug 27 Javascript
何时使用Map来代替普通的JS对象
Apr 29 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/07/07 PHP
Oracle Faq(Oracle的版本)
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP基本语法总结
2014/09/06 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
js实现查询商品案例
2020/07/22 Javascript
Python实现快速多线程ping的方法
2015/07/15 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
幼教毕业生自我鉴定
2014/01/12 职场文书
函授生自我鉴定
2014/03/25 职场文书
年终晚会活动方案
2014/08/21 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏