参考书籍:JavaScript设计模式
声明2个类,第一个类的实例赋值给第二个类的原型。例如
//声明父类
function SuperClass() {
this.superValue = true;
};
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
return this.superValue;
};
//声明子类
function SubClass() {
this.subValue = false;
};
//继承父类
SubClass.prototype = new SuperClass();
//为子类添加共有方法
SubClass.prototype.getSubValue = function () {
return this.subValue;
}
类的原型对象的作用就是为类的原型添加共有的方法,但是不能直接访问这些属性和方法,必须通过原型 prototype来访问。
我们在实例化一个父类的时候,新的对象复制了父类构造函数内的属性和方法并把原型_proto_(新实例化对象的原型)指向了父类的原型对象。新实例化的对象不仅可以访问父类原型上的属性和方法,同样可以访问从父类构造函数中复制的属性和方法。将这个新实例化的对象赋值给了子类,子类就有了同新对象一样的权利。 这就是类式继承原理。
JS
//声明父类
function SuperClass() {
this.superValue = true;
};
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
return this.superValue;
};
//声明子类
function SubClass() {
this.subValue = false;
};
//继承父类
SubClass.prototype = new SuperClass();
//为子类添加共有方法
SubClass.prototype.getSubValue = function () {
return this.subValue;
}
function displayBook() {
var subInstance = new SubClass();
console.log('super value: ' + subInstance.getSuperValue());//true
console.log('sub value: ' + subInstance.getSubValue());//false
}
可以通过 instanceof 来检测某一个对象是否是某一个类的实例(而不是继承),它是通过判断对象的 prototype 链来确定这个对象是否是某个类的实例,而不关系对象与类的自身结构。
console.log(subInstance instanceof SuperClass);//true
console.log(subInstance instanceof SubClass);//true
console.log(SubClass instanceof SuperClass);//false
类似继承缺点
- 由于子类通过其原型 prototype对父类实例化,继承了父类。父类中的公有属性要是引用类型,就会在子类中被所有实例共有,因此一个子类的实例更改子类原型(从父类函数中继承的公有属性)就会直接影响到其他子类。
例如:
//声明父类
function SuperClass() {
//引用类型的公有属性
this.books = ['java', 'html'];
};
//声明子类
function SubClass() {
};
SubClass.prototype=new SuperClass();
function displayBook() {
var sub1 = new SubClass();
console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html
var sub2 = new SubClass();
sub2.books.push('css');
console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html,css
console.log('sub2 super value: ' + sub2.books);//sub2 super value: java,html,css
}
sub2修改了book的属性就会影响到sub1中book的属性。
2. 由于子类实现的继承是靠其原型prototype对父类的实例化实现的,因此在创建父类的时候,是无法向父类传递参数的,因而在实例化父类的时候也无法对父类构造函数的属性进行初始化。
优化参照
https://blog.csdn.net/weixin_44924173/article/details/91040014