functional继承模式 摘自javascript:the good parts

 更新时间:2011年06月20日 19:53:03   作者:  
javascript:the good parts 书中Inheritance部分讲到了一种functional的继承方式, 具体这个functional该如何翻译,就不是很清楚了, 就直接意会一下吧
这种模式的作用在于确保对象属性的真正私有化, 我们无法直接访问对象的状态, 只能通过特权方法来进行操作.
下面直接来个例子吧.
复制代码 代码如下:

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实现图片懒加载插件的方法

    Javascript实现图片懒加载插件的方法

    最近由于公司项目需要,要利用Javascript实现图片懒加载效果,尝试起来发现并不难,于是将自己的实现过程分享出来给大家学习和参考,希望对有需要的朋友们带来一定的帮助,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • 使用Modello编写JavaScript类

    使用Modello编写JavaScript类

    使用Modello编写JavaScript类...
    2006-12-12
  • webpack源码之loader机制详解

    webpack源码之loader机制详解

    本篇文章主要介绍了webpack源码之loader机制详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • js 模拟实现类似c#下的hashtable的简单功能代码

    js 模拟实现类似c#下的hashtable的简单功能代码

    越来越感觉js对集合的处理没有c#强大。比如在实际开发中,经常用到在一维数组或者二维数组里取某一个满足某些条件的项,通常的处理方式就是遍历数组,对比条件,匹配就取出,然后结束循环。
    2010-01-01
  • 一些相见恨晚的 JavaScript 技巧

    一些相见恨晚的 JavaScript 技巧

    本文从7个方面讲述 JavaScript 中那些你不很熟知但非常实用的技巧。
    2010-04-04
  • js获取元素的偏移量offset简单方法(必看)

    js获取元素的偏移量offset简单方法(必看)

    下面小编就为大家带来一篇js获取元素的偏移量offset简单方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 三种方式获取XMLHttpRequest对象

    三种方式获取XMLHttpRequest对象

    这篇文章主要介绍了获取XMLHttpRequest对象的三种方式,需要的朋友可以参考下
    2014-04-04
  • JavaScript 2018 中即将迎来的新功能

    JavaScript 2018 中即将迎来的新功能

    JavaScript 2018 中即将迎来的新功能:异步生成器及更好的正则表达式。更多常规正则表达式功能大家跟随小编一起通过本文学习吧
    2018-09-09
  • 用VsCode编辑TypeScript的实现方法

    用VsCode编辑TypeScript的实现方法

    这篇文章主要介绍了用VsCode编辑TypeScript的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 各种页面定时跳转(倒计时跳转)代码总结

    各种页面定时跳转(倒计时跳转)代码总结

    下面对实现页面定时跳转(也称倒计时跳转)做一下总结,以备不时之需,经常使用的朋友可以参考下
    2013-10-10

最新评论