廖雪峰老师的继承写得很清楚,传送门
阮一峰老师的关于js继承机制的设计思想博客,传送门
布兰登设计js的时候,引用了面向对象里的new,但是js里又没有类,于是布兰登就让new一个构造函数,用于从原型对象生成一个实例对象, 构造函数有一个prototype属性,该属性包含一个对象。而所有实例对象所需要共享的属性和方法都放在这个对象里面;不需要共享的属性和方法,就放在构造函数里面。
<小声哔哔两句:廖老师和阮老师的博客写的真是好,蟹蟹大佬们的辛勤付出>
js实现继承: 1》原型继承,需要借助一个空函数来正确实现原型链
//定义继承函数
function inherit(Child,Parent){
var F = function(){}
F.prototype = Parent.prototype
Child.prototype = new F()
Child.prototype.constructor = Child
}
//定义父
function Student(name){
this.name = name
}
Student.prototype.getName = function(){
console.log("学生姓名:",this.name)
}
//定义子
function primaryStudent(name,grade){
Student.call(this,name)
this.grade = grade
}
// 实现原型继承链:
inherits(PrimaryStudent,Student)
// 绑定其他方法到PrimaryStudent原型:
primaryStudent.prototype.getGrade = function(){
console.log("班级:",this.name)
}
JavaScript的原型继承实现方式就是:定义新的构造函数,并在内部用call()调用希望“继承”的构造函数,并绑定this;借助中间函数F实现原型链继承,最好通过封装的inherits函数完成;继续在新的构造函数的原型上定义新方法。
2》class继承
class Student{
constructor(name){
this.name = name
}
say(){
console.log("my name is ",this.name)
}
}
class PrimaryStudent extends Animal{
constructor(name,grade){
super(name)
this.grade = grade
}
getGrade(){
console.log("i am in grade ",this.grade)
}
}
原型以及原型链的理解: 构造函数有一个prototype属性(存储了对象的共同属性,就是原型),该属性其实指向的是一个对象。这个对象就是构造函数构造出来的对象所共有的属性集合。每个对象都有一个隐藏属性,该隐藏属性指向原型(就是这个共有属性的集合)。【原型使得我们可以不必重复声明共有的属性。每个对象都有一个隐藏属性,指向原型】