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);
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。
