• javascript学习(6)——[基础回顾]继承/聚合


    本次博客主要说下继承和聚合在javascript中的应用:

    继承在前边的第五篇中也有所涉及,其实也挺简单的,

    下面粘一段代码:

    /**
     * 继承
     */
    (function(){
    	//创建一个人员类
    	function Person(name){
    		this.name = name;
    	}
    	//创建教师类
    	function Teacher(name,books){
    		//call方法可以将一个函数的对象上下文从初始化变成有this来决定
    		//调用Person的构造函数,因为Person没用new 所以他是个空对象
    		//相当于java中的super函数
    		Person.call(this,name);
    		this.books = books;
    	}
    	//使老师类继承人员类
    	Teacher.prototype = new Person();
    	Teacher.prototype.constructor = Teacher;
    	//给Teacher扩展一个函数
    	Teacher.prototype.getBook = function(){
    		return this.name +" "+ this.books;
    	}
    	//测试
    	var jim = new Teacher("JIM","EXTJS4");
    	//alert(jim.getBook());
    	
    	/**
    	 * 创建Extend函数为了程序中石所有的集成操作
    	 */
    	function extend(subClass,superClass){
    		//1.叫子类原型类属性等于父类的原型属性
    		//初始化一个中间空对象,为了转换主父类关系
    		var F = function(){};
    		F.prototype = superClass.prototype;
    		//2.让子类集成F
    		subClass.prototype = new F();
    		subClass.prototype.constructor = subClass;
    		//3.为子类增加属性superClass
    		subClass.superClass = superClass.prototype;
    		//4.增加一个保险,就算你是的原型类是超类(Object) 那么也要把你的构造函数级别降下来
    		if(superClass.prototype.constructor == Object.prototype.constructor){
    			superClass.prototype.constructor = superClass;
    		}
    	}
    	//测试
    	function Author(name,books){
    		Author.superClass.constructor.call(this,name);
    		//Person.call(this,name);
    		this.books = books;
    		this.getBook = function(){
    			return this.name +" "+ this.books;
    		}
    	}
    	//继承
    	extend(Author,Person);
    	//彼德
    	var peter = new Author("YUNFENGCHENG","JAVASCIPT");
    	alert(peter.getBook())
    })()

    其实用到最多的就是下面两句:

    //使老师类继承人员类
    	Teacher.prototype = new Person();
    	Teacher.prototype.constructor = Teacher;
    这两句的意思说的是:首先我将Teacher类的prototype的指针指向Person类,另外是将Teacher类的构造方法的指针还是让其指向自己。

    其中call(),当然还要一个类似函数apply(),我们之后会专门拿出一篇文章来解释一下,ms我之前有转载过一篇写的不错的文章,大家可以找下,我也会将其引入这个专题来。

    ------------------------

    好吧,我还是想忍不住想说一下call 和 apply的用法和简单的说下他们之间的不同,另外将我转载的一篇博客的地址放在这里,供大家参考。


    call方法:

    a.fun.call(b,"c","d");

    简单的说来,它的意思就是a对象的fun函数可以叫b来执行,其中c和d是属于传入的参数,也就是说如果b来执行继承过来a的fun函数的时候,可以将其这两个参数调用;

    call与apply之间的不同之处就是在后边参数的不同,call可以是任意类型,而apply必须是数组。

    转载文章是:

    http://blog.csdn.net/sunyingyuan/article/details/15048795


    聚合:

    有的时候不需要严格的继承,我们真正需要的是一个类(几个)中的的一些函数,有的时候我们又叫掺元类。

    /**
     * 掺元类
     * 有的时候不需要严格的继承,我们真正需要的是一个类(几个)中的的一些函数
     * 
     */
    (function(){
    	//我们准备将要被聚合的函数
    	var JSON = {
    		toJSONString :function(){
    			var outPut = [];
    			for(key in this){
    				outPut.push(key+" --> "+this[key])
    			}
    			return outPut;
    		}
    	};
    	/**
    	 * 聚合函数
    	 */
    	function mixin(receivingClass,givingClass){
    		for(methodName in givingClass){
    			if(!receivingClass.__proto__[methodName]){
    				receivingClass.__proto__[methodName] = givingClass[methodName]
    			}
    		}
    	}
    	var o = {name:"YUN",age:27}
    	mixin(o,JSON);
    	document.write(o.toJSONString().join(","))
    //	JSON.prototype = { //如果说不用prototype
    //		toJSONString :function(){
    //			var outPut = [];
    //			for(key in this){
    //				outPut.push(key+" --> "+this[key])
    //			}
    //			return outPut;
    //		}
    //	}
    //	//制作聚合函数
    //	function mixin(receivingClass,givingClass){
    //		for(methodName in givingClass.prototype){
    //			//本类中没有这个函数的情况下我在聚合,否则跳过
    //			if(!receivingClass.prototype[methodName]){
    //				receivingClass.prototype[methodName] = givingClass.prototype[methodName]
    //			}
    //		}
    //	}
    //	//var o = {name:"YUN",age:27}
    //	var o = function(){
    //		this.name = "YUN";
    //		this.age = 17
    //	}
    //	mixin(o,JSON);
    //	var a = new o();
    //	document.write(a.toJSONString().join(","))
    })()
    
    其实聚合的方法,显得更加的简单,就是当我们取到原型链的上端时,然后将方法名和方法体赋值过来就行了,由于对象直接继承原型,所以原型链的函数就直接能够继承了。

  • 相关阅读:
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
    Redisson分布式锁学习总结:公平锁 RedissonFairLock#unLock 释放锁源码分析
    npm更改为淘宝镜像
    博客园统计阅读量
    自动下载MarkDown格式会议论文的程序
    修改linux ll 命令的日期显示格式
    Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存
    Log4j2 Jndi 漏洞原理解析、复盘
    一个菜鸡技术人员,很另类的总结
  • 原文地址:https://www.cnblogs.com/sunyingyuan/p/3686226.html
Copyright © 2020-2023  润新知