面向对象的程序设计2

继承
<1>原型链
利用原型让一个引用类型继承另一个引用类型的属性和方法
function dad(){
    this.prototype=true;
}
function son(){
    this.sonprototype=false;
}
//继承dad
son.prototype=new dad();
原型链出现的问题:共享问题
function dad(){
    this.colors=["red","blue","green"];
}
function son(){

};
//继承
son.prototype=new dad();
var a =new son();
a.colors.push("black");
alert(a.colors);   //"red,blue,green,black"
var b=new son();
alert(b.colors);   //"red,blue,green,black"

<2>借用构造函数---------使用call和apply
function dad(){
    this.colors=["red","blue","green"];
}
function son(){
    //继承dad()
    dad.call(this);
}
var a =new son();
a.colors.push("black");
alert(a.colors);   //"red,blue,green,black"
var b=new son();
alert(b.colors);   //"red,blue,green"
优点:可以传参数
function dad(name)
{
    this.name=name;
}
function son(){
    //继承
    dad.call(this,"william");   //传参数
    this.age=21;
}
var a=new son();
alert(a.name);    //"william"
alert(a.age);            //21
缺点:方法都在构造函数中定义,函数没法复用

<3>组合继承
原型类:继承原型属性和方法
借用构造函数:继承实例属性
function dad(name){
    this.name=name;
    this.colors=["red","blue","green"];
}
dad.prototype.sayname=function(){
    alert(this.name);
};          //分号
function son(name,age) {  //借用构造函数
    //继承属性
    dad.call(this, name);
    this.age = age;

    //继承方法  -------原型链
    son.prototype = new dad();
    son.prototype.constructor = son;
    son.prototype.sayage = function () {
        alert(this.age);
    }
}
var a=new son("cyc",20);
a.colors.push("black");
alert(a.colors);        //"red,blue,green,black"
a.sayname();           //"cyc"
a.sayage();            //20

var b=new son("william",21);
alert(b.colors);        //"red,blue,green"
b.sayname();           //"william"
b.sayage();            //21

<4>原型式继承
function object(o){
    function F(){};
    F.prototype=o;
    return new F();
}
在object()函数内部,先创建了一个临时性的构造函数,
然后将传入的对象作为整个构造函数的原型,最后返回了
整个临时类型的新实例

-------------example--------------
var person={
    name:"william",
    friends:["cyc","aaa"]
}
var person1=object(person);
person1.name="b";
person1.friends.push("bbb");
var person2=object(person);
person2.name="c";
person2.friends.push("ccc");
alert(person.friends);       //"cyc,aaa,bbb,ccc"

<5>寄生式继承
function createAnother(original){
    var clone=object(original);
    clone.sayHi=function(){
        alert("hi");
    }
    return clone;
}
<6>寄生组合式继承
function dad(name)
{
    this.name=name;
    this.colors=["red","green"];
}
dad.prototype.sayname=function(){
    alert(this.name);
}
function son(name,age){
    dad.call(this,name);   //第二次调用dad()
    this.age=age;
}
son.prototype=new dad();    //第一次调用dad()
son.prototypeconstructor=son;
son.prototype.sayage=function(){
    alert(this.age);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值