前言
学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继承则继承父类的实际的方法,js 中主要依靠原型链来实现继承,无法做接口继承。
学习 js 继承之前,我们需要了解原型这一 概念,我们知道 js 中创建对象通过构造函数来创建,而每一个构造函数都有对应的 prototype 的属性,该属性对应的值为一个对象,这个对象也就是所有通过该构造函数创建出来的实例所共享的属性和方法,而创建出来的每一个实例对象都有一个指针指向这些共享的属性和方法,这个指针就是所说的 __proto__(注意这里是双下划线),因此就产生了三种来获取原型的方法,分别是 p.__proto__,p.constructor.prototype,Object.getPrototypeOf( p ),这就是我对原型的了解。
当我们在访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会在它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是这样一层一层向上找下去,也就产生了原型链的概念。原型链的尽头就是 object.prototype ,所以我们每创建的一个对象都有 toString(),valueOf() 等方法的原因。
有了上面的基础常识作为铺垫,我们来看下 js 中具体怎么来实现继承。
正文
js 中实现继承的方法有6种,具体实现如下:
(1)原型链实现继承
//定义父类 function superFun(){ this.superProperty = "super"//给父类构造函数添加参数属性 } superFun.prototype.getSuperValue = function(){//给父类构造函数添加原型方法 return this.superProperty } //定义子类 function subFun(){ this.subProperty = "sub" } subFun.prototype = new superFun()//继承了superFun父类 ,这一点最主要 subFun.prototype.getSubValue = function(){//在继承父类之后,在原型上添加新的方法或者重写父类的方法 return this.subProperty } var sub = new subFun()//实例化一个子类对象 console.log(sub.superProperty);//super--判断继承父类的属性 console.log(sub.subProperty);//sub--子类的实例的属性 console.log(sub.getSuperValue());//super--判断继承父类的方法 console.log(sub.getSubValue());//sub----子类实例的方法 console.log(sub instanceof superFun);//true----原型链判断 console.log(sub instanceof subFun);//true----原型判断