//通过构造函数创建父类
function People(name,age)
{
this.name = name
this.age = age
}
//通过构造函数的prototype添加函数
People.prototype.say = function(content)
{
console.log(this.name + "说:" + content)
}
var p1 = new People("张三",22)
p1.say("hello!")
//创建构造函数子类
function Man(name , age , sex)
{
//子类自定义属性
this.sex = sex
People.apply(this,[name,age])
}
// 把父类的原型链赋值给子类,可以实现原型链继承
// 用父类的原型对象创建一个临时对象,赋值给子类
Man.prototype = new Object(People.prototype)
// 一个类型的构造函数必须指向本身,通过原型继承,子类的构造函数指向了父类的构造函数
// 纠正子类构造函数的指向,让它指向自己
Man.prototype.constructor = Man
var m = new Man ("李四",23,"男")
m.say("你好")
ES6类的声明及继承
在ES6中,class关键字用来定义类,关键字后跟类名
{}是类的属性和方法,属性要放在构造函数constructor中
class People{
constructor(name, age , phone) {
this.name= name
this.age = age
this.phone = phone
}
在ES6类的方法, 定义风格发生了变化, 会将函数添加到原型对象中
say(content)
{
console.log(this.name)
}
}
var p1 = new People("张三",33, 110)
p1.say("我是单身啊")
// extends 扩展 继承People类的属性和方法
class Man extends People{
constructor(name,age,phone,sex)
{
//super() 可以调用父类的构造函数
super(name , age , phone)
this.sex = sex
}
}
//声明一个类的实例对象,先调用本类中的构造函数, 如果类有继承关系,构造函数的执行顺序
// 类 在new的时候会自定自己的构造函数,如果类继承了其他类,会从自身的构造函数中通过super取调用父类中构造函数,先把父类中的构造函数执行完(初始值),在回到自己的构造函数中执行初始化
// Object构造函数=>父类的父类(....)=>父类构造函数=>类本身