在日常的开发中,经常会封装一些方法用作公共的方法。此后在定义某一个子类方法,需要继承父类方法的一下函数、变量等,此时 就用到了继承.。个人见解,欢迎大家指正
1、原型时继承,主要属性propotype
缺点:继承单一,所有新实例都会共享父类实例的属性(一个实例修改了原型属性,另一个实例的原型属性也会被修改)
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function sub(){
this.name = "Cat"
}
sub.prototype = new Animal()
var s = new sub()
console.log(s.showName()) // Cat
2、构造函数继承,主要方法call()
缺点:只能继承父类构造函数的属性,无法实现构造函数的复用
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat() {
Animal.call(this,'Cat')
}
var s = new Cat()
console.log(s.showName()) // Cat
3、组合继承,将前边俩种方法合并
缺点:调用了两次父类构造函数
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name) {
Animal.call(this,name)
}
Cat.propotype = new Animal()
var s = new Cat("Dog")
console.log(s.showName()) // Dog
4、原型式继承
缺点:所有实例都会继承原型上的属性
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(obj) {
function s(){}
s.prototype = obj
return new s()
}
var s = new Animal("Dog")
var s1 = Cat(s)
console.log(s1.showName()) // Dog
5、寄生组合式继承
寄生是指在函数内返回对象,然后去调用;组合是指函数的原型等于另一个实例,函数中可使用call()引入另一个构造函数
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(obj) {
function S(){}
S.prototype = obj
return new s()
}
// Cat是S实例的一种表示法
// s实例(S实例)的原型继承了父类函数的原型
var s = Cat(Animal.prototype)
// 组合,继承父类构造函数的属性
function Dog(name) {
Animal.call(this,name)
}
// 继承s实例
Dog.prototype = s
// 必须修复实例
s.constructor = Dog
var s1 = new Dog("Dog")
console.log(s1.showName())
认真做事儿,踏实做人