zoukankan      html  css  js  c++  java
  • functional继承模式 来自javascript:the good parts

    <<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.

  • 相关阅读:
    java8 stream().map().collect()用法
    Java中Collections的emptyList、EMPTY_LIST详解
    zxing实现java二维码生成和解析
    机器学习与数据挖掘—K邻近算法(KNN)
    第一个Web项目(IDEA)
    Ucore操作系统实验-实验课程设计
    数据挖掘与机器学习--损失函数
    机器数据挖掘--常见监督学习算法以及数据挖掘流程
    Tomcat安装-环境变量配置-启动-关闭
    操作系统实验教程(Ucore)--Lab6
  • 原文地址:https://www.cnblogs.com/AndyWithPassion/p/javascript_inheritance.html
Copyright © 2011-2022 走看看