欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES5的继承

程序员文章站 2022-07-15 20:38:14
...

首先最基本的类:

可以在构造函数和原型链里添加方法,静态方法可以通过类名调用。

//构造函数中增加属性和方法       
function Person(){
    this.name = "fur"
    this.age = 1
    this.play = function(){
        console.log(this.name+"在玩")
    }
}
//原型链上增加属性和方法
Person.prototype.sex = "girl"
Person.prototype.study = function(){
    console.log(this.name+"在学习")
}

//静态方法
Person.init = function(){
    console.log("静态方法")
}
Person.init()//静态方法

var p = new Person;

console.log(p.name)//fur
console.log(p.sex)//girl

p.play()//fur在玩
p.study()//fur在学习

对上面的函数进行继承:

第一种:对象冒充实现继承

好处:可以继承构造函数的属性和方法

弊端:无法继承原型链上的属性和方法

function Man(){
    
    Person.call(this)
}
var m = new Man()
m.play()//fur在玩
//m.study()  报错

第二种:原型链实现继承

好处:可以继承构造函数和原型链的属性和方法

弊端:实例化子类的时候没法给父类传参(见下面一个例子)

function Man(){

}

Man.prototype = new Person()
var m = new Man()
m.play()   //fur在玩
m.study()  //fur在学习

实例化子类的时候没法给父类传参的例子:

function Person(name,age){
    this.name = name
    this.play = function(){
        console.log(this.name+"在玩")
    }
}
//原型链上增加属性和方法
Person.prototype.study = function(){
    console.log(this.name+"在学习")
}
//原型链实现继承
function Man(){
}

Man.prototype = new Person()
var m = new Man("fur",1)
m.play()//undefined在玩
m.study()//undefined在学习

第三种:原型链+对象冒充的组合继承模式

第一种写法:Man.prototype = new Person()

即 子.prototype = new 父()

第二种写法:Man.prototype = Person.prototype

即 子.prototype = 父.prototype

//构造函数中增加属性和方法       
function Person(name,age){
    this.name = name
    this.age = age
    this.play = function(){
        console.log(this.name+"在玩")
    }
}
//原型链上增加属性和方法
Person.prototype.sex = "girl"
Person.prototype.study = function(){
    console.log(this.name+"在学习")
}

//原型链实现继承
function Man(name,age){

    Person.call(this,name,age)
}
//第一种
Man.prototype = new Person()
//第二种
//Man.prototype = Person.prototype

var m = new Man("fur",1)
m.play()//fur在玩
m.study()//fur在学习
相关标签: JavaScript