继承的三种方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承的三种方式相关的知识,希望对你有一定的参考价值。

【JS OOP中的继承】
1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
>>>继承的两方,发生在两个类之间
2、扩展Object实现继承
①、声明父类

function Person(){
         
}

声明子类

function Son(){

}

②、通过prototype给Object类添加一个扩展方法;

Object.prototype.extend = function(parent){
      for(var i in parent){
           this[i] = parent[i];
      }
}

③、分别拿到父类对象和子类对象

var p = new Person();
var s = new Student();

④、用子类对象,调用扩展方法,实现继承操作

s.extend(p);

3、实现继承的原理
通过循环,将父类对象的所有属性和方法,全部赋给子类对象,关键点在于for-in循环,即使不扩散Object,也能通过简单的循环实现操作
4、扩展Object继承的缺点
①、无法通过一次实例化,直接拿到完整的子类对象,而需要先拿到父类对象和子类对象两个对象,在手动合并。
②、扩展Object的继承方法,也会保留在子类的对象上。

【JS OOP中的继承】
1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
>>>继承的两方,发生在两个类之间

2、使用原型实现继承
①、定义父类

function Parent(){

}

定义子类

function Son(){

}

②、将父类对象,赋值给子类的prototype

Son.prototype = new Person();

③、拿到子类对象时,就会将父类对象的所有的属性和方法,添加到__proto__

var s = new Son();

 

3、使用原型继承的原理
将父类对象,赋值给子类的prototype,那么父类对象的属性和方法就会出现在子类的prototype中。那么,实例化子类时,
子类的prototype又会到子类对象的__proto__中,最终,父类对象的属性和方法,会出现在子类对象的__proto__中

4、这种继承的特点
①、子类自身的所有属性都是成员属性,父类继承过来的属性都是原型属性
②、依然无法通过一步实例化拿到完成的子类对象

【call/bind/apply】
1、三个函数的作用:通过函数名调用这三个函数,可以强行将函数中的this指定为某个对象
2、三个函数的写法(区别):
call写法:func.call(func的this指向的obj,func参数1,func参数2,……);
apply写法:func.apply(func的this指向的obj,[func参数1,func参数2,……]);
bind写法:func.bind(func的this指向的obj)(func参数1,func参数2,……);
3、三个函数的唯一区别:在于接受func的参数列表的方式不同,除此之外,没有任何不同。

【使用call/bind/apply实现继承】
1、实现步骤
①、定义父类

function Person(name){

}

 

②、定义子类时,在子类中使用三个函数,调用父类,将父类函数的this,指向为子类函数的this

function Student (no) {
       this.no = no;
       Person.call(this,name,age);
}

 

③、实例化子类时,将自动继承父类属性

var s = new Son(12,"张三");

  

以上是关于继承的三种方式的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程实现的三种方式

子类继承基类的三种继承方式

求解 c++中三种继承方式的区别!

继承的三种方式

继承的三种方式

C++中的三种继承方式