js 继承(1)

js 如何实现继承呢?

下面是一个简单的继承demo

console.clear();
//child 继承 parent
var extend=function(child,parent)
{
  child.prototype=new parent();
  
}
function A(){
  this.name="A";
  this.sayHello=function(){
    console.log("Hello , "+this.name);
  }
  
}

function B(){
  this.sex=‘man‘;
  this.mySex=function(){
    console.log("sex:"+this.sex);
  }
}



extend(B,A);

var b=new B();
b.mySex();
b.sayHello();

?运行结果:

sex:man
?
Hello , A

说明:B 本身没有sayHello 方法,而是从A 继承过来的.

?

那么我们再让B继承另外一个类C?

function C(){
  this.age=26;
  this.myAge=function(){
    console.log("age:"+this.age);
  }
}



extend(B,A);
extend(B,C);
var b=new B();
b.mySex();
b.sayHello();

?报错:

?继承C 之后,调用sayHello竟然报错,但是sayHello不是从A 继承过来的吗?

说明我们的继承方法有问题:

var extend=function(child,parent)
{
  child.prototype=new parent();
  
}

?B先继承A,然后继承C,那么之前继承A的属性都没了.这显然不合要求.

所以我优化一下继承方法:

//child 继承 parent
var extend=function(child,parent)
{
  var p1=child.prototype;
  child.prototype=new parent();
  child.prototype.__proto__=p1;
  
}

?完整代码如下:

console.clear();
//child 继承 parent
var extend=function(child,parent)
{
  var p1=child.prototype;
  child.prototype=new parent();
  child.prototype.__proto__=p1;
  
}
function A(){
  this.name="A";
  this.sayHello=function(){
    console.log("Hello , "+this.name);
  }
  
}

function B(){
  this.sex=‘man‘;
  this.mySex=function(){
    console.log("sex:"+this.sex);
  }
}

function C(){
  this.age=26;
  this.myAge=function(){
    console.log("age:"+this.age);
  }
}


extend(B,A);
extend(B,C);
var b=new B();
b.mySex();
b.sayHello();
b.myAge();

?执行结果:

sex:man
?
Hello , A

age:26

?

?

即B 成功地调用了A和C 的方法

?我们继续优化,因为__proto__在IE中不能访问.

优化的结果:

 //child 继承 parent
        var extend=function(child,parent)
        {
            var p1=child.prototype;
            var p2=parent.prototype;
            parent.prototype=p1;
            child.prototype=new parent();
            parent.prototype=p2;

        }
        function A(){
            this.name="A";
            this.sayHello=function(){
                console.dir("Hello , "+this.name);
            }

        }

        function B(){
            this.sex=‘man‘;
            this.mySex=function(){
                console.dir("sex:"+this.sex);
            }
        }

        function C(){
            this.age=26;
            this.myAge=function(){
                console.dir("age:"+this.age);
            }
        }


        extend(B,A);
        extend(B,C);
        var b=new B();
        b.mySex();
        b.sayHello();
        b.myAge();
        console.dir(A);
        console.dir(B);
        console.dir(C);

?运行结果:

?

?继承方法:

 //child 继承 parent
        var extend=function(child,parent)
        {
            var p1=child.prototype;
            var p2=parent.prototype;
            parent.prototype=p1;
            child.prototype=new parent();
            parent.prototype=p2;
            delete p1;
            delete p2;
        }

?

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。