深入学习jquery源码之继承方案的选择

prototype实现继承

先访问自己本身的方法,没有再访问自己原型的方法,本身原型没有访问父类,父类没有,访问父类的原型方法...继续往上

    Object.prototype.say=function  () { //最上层定义say的方法
       alert("我是顶层的方法");
	}
	function person () {
	    this.say=function  () {
		   alert("我是父类的方法");//先访问本身方法,再访问原型方法
	    }
	}
 
	person.prototype.say=function  () {
	     alert("我是父类原型的方法");
	}
 
	function study () {
	this.say=function  () {
	   alert("本身的方法");
	     }
    }

	study.prototype=new person();

	 study.prototype.say=function  () {
	   alert("本身原型的方法");
	 } 

    var zhangsan=new study ();
	alert(zhangsan.say)//父类有方法,不再向顶层找方法

create()实现继承

create的第二参数是一个对象,其中的属性如果和person重名,则会覆盖person的属性。

var person={
        name:"Tom",
        age:23,
        job:"厨师"
    };
    var anotherPerson=Object.create(person,{
        name:{
            value:"Mike"
        }
    });
    alert(anotherPerson.name);

apply()实现属性和方法继承全部继承

apply : obj1.fun.apply(obj2,[参数1,参数2....]) 让对象1的方法冒充成对象2的方法。

function person (name) {
   this.name=name;//this代表window this那个对象引用,就是那个对象的函数function person()
   this.say=function  () {
     alert(this.name)
   }
}
 
function student () {
 window.person.cell(this)//this代表zhangsan
}
var zhangsan=new student ();
zhangsan.name;//张三
 
function student () {
 window.person.apply(this,["zhangsan"])//参数以数组形式传递
}
 
var zhangsan=new student ();
  zhangsan.name;
  zhangsan.say();

js实现多态

function Animal(name,age){
		this.name=name;
		this.age=age;
		this.shout=function(){
			alert("我是:"+this.name+",今年:"+this.age);
		};
		this.action=function(){
			alert("会吃");
		};
	}
	
	function Dog(name,age){
		Animal.apply(this, [name,age]);//this当前对象,name传入的参数,原型还是Animal
	}

    Dog.prototype=new Animal();//类型的继承,原型变了不再是Animal,拥有了Animal对象的属性和方法
	
	var jack=new Dog("jack",1);
	alert(jack.name);
	alert(jack.age);
	jack.shout();//调用父类的方法
	jack.action();

构造函数call()

call : obj1.fun.call(obj2,参数1......).让对象1的方法冒充成对象2的方法。

function person () {
   this.name="张三";
   this.say=function  () {
     alert(this.name)
   }
}
 
function student () {
  this.name="李四";
}
var ren=new person ();
var zhangsan=new student ();//也有了say方法
 
ren.say.call(zhangsan)

构造函数也可以通过子对象向父对象传递参数

function SuperType(name){
        this.name=name
    }
    function SubType(){
        SuperType.call(this,"Tom")//或者apply()
    }
    var instance1=new SubType();
    alert(instance1.name);


 

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/85220354