实现继承的关键在于子类型的原型为父类型的实例对象。
//父类型
function Super() {
this.superProp = 'Super Prop'
}
Super.prototype.showSuper = function () {
console.log(this.superProp)
}
//子类型
function Sub() {
this.subProp = 'Sub Prop'
}
Sub.prototype = new Super()
Sub.prototype.showSub = function () {
console.log(this.subProp)
}
var sub = new Sub()
sub.showSuper()
其中关键的代码在于
Sub.prototype = new Super()
之后是这段代码的内部结构
内部结构
这里有一个问题需要注意,我们创建的是Sub的实例。但是我们查看浏览器的时候发现它的构造函数指向Super。
通过查看上述的原型链我们发现由于Sub函数对象指向了Super实例对象,改变了Sub原有的构造函数的位置。因此我们需要改一下代码:
Sub.prototype.constructor = Sub
借用构造函数继承
定义父类型的构造函数
定义子类型的构造函数
在子类型的构造函数中调用父类型的构造函数
关键:
在子类型的构造函数中通过call调用父类型的构造函数
例如:
function Person(name, age) {
this.name = name
this.age = age
}
function Student(name, age, price) {
Person.call(this, name, age)
this.price = price
}
var s = new Student('Tom', 12, 100)
原型链加借用构造函数的组合继承
- 利用原型链实现对父类型对象的方法的继承。
- 利用call()借用父类型构造函数初始化相同的属性。
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.setName = function (name) {
this.name = name
}
function Student(name, age, price) {
Person.call(this, name, age)
this.price = price
}
Student.prototype = new Person() //为了看到父类型的方法
Student.prototype.constructor = Student //修正构造方法
Student.prototype.setPrice = function (price) {
this.price = price
}
网友评论