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用Date对象处理时间实现思路及代码
Jan 31 Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 Javascript
js闭包的用途详解
Nov 09 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
Jul 19 Javascript
js+css实现红包雨效果
Jul 12 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 Javascript
使用jquery实现轮播图效果
Jan 02 jQuery
微信小程序input抖动问题的修复方法
Mar 03 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输入流php://input使用浅析
2014/09/02 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
js的对象与函数详解
2019/01/21 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
二年级数学教学反思
2016/02/16 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
简单介绍Python的第三方库yaml
2021/06/18 Python