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);