欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS继承机制的实现

程序员文章站 2022-07-06 19:57:21
...
+function(exports){
	
	//命名空间
	var MML={};
	
	/**
	 * 简单继承的实现
	 * 
	 * 1、通过代理function实例对象区分父对象与子对象的prototype属性指向的prototype对象
	 * 2、通过闭包原理实现动态生成私有属性存取器
	 * 3、子类可以添加自身的私有属性、特权方法、原型对象
	 * 
	 * @time 2015年2月5日13:32:05
	 * @author 710335997@qq.com
	 * 
	 * @param {Object} parent
	 * @param {Object} param
	 */
	MML.extend=function(parent,param){
		
		function Proxy(){}
		
		Proxy.prototype=parent.prototype;
		
		function Son(){
			
			var _self={};//存储私有属性、真正的隐藏私有属性
			
			parent.call(this);//拷贝父类属性到子类
			
			if(param&&typeof param ==="object"){
			
				for(var p in param){
					
					var _=p.toString().charAt(0).toUpperCase()+p.toString().substr(1);
					
					if(p!=="prototype"&&param.hasOwnProperty(p)&& typeof param[p] ==="string"){
						
						Son.prototype["set"+_]=(function(key){
							var __=key;
							return function(value){
								_self[__]=value;
							};
							
						}(p));
						
						Son.prototype["set"+_](param[p]);
						
						Son.prototype["get"+_]=(function(key){
							var __=key;
							return function(){
								return _self[__];
							}
						}(p));
					}
					if(p=="prototype" && param[p] && typeof param[p]==="object"){
						for(var a in param[p]){
							Son.prototype[a]=param[p][a];
						}
					}
					
				}
				
			}
		};
		
		Son.prototype=new Proxy();
		
		return Son;
	};
	exports.MML=MML;
	
}(window);

function Animate(){
	this.type="";
	this.age=3;
}

var Dog=new MML.extend(Animate,{
	name:"dog",
	type:"Dog",
	prototype:{
		say:function(){
			console.log("i am "+this.getName());
		}
	}
});
var animate=new Animate();

var dog=new Dog();

console.log(dog.getName())//输出: dog 

Animate.prototype.test=function(){
	console.log("父类原型方法");
};


console.log(Animate.prototype==Dog.prototype);//false 分开了原型


console.log(animate.test==dog.test);// true  依然可以继续原型方法

dog.test();//输出: 父类原型方法

console.log(animate instanceof Animate); // true
console.log(animate instanceof Dog); //false 
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animate); //true