目录
1 原型式继承
场景
前置问题
实现方法
2 借用构造函数实现继承
前置问题
错误的实现方式
正确的实现方式
1 原型式继承
场景
a、创建一个纯洁的对象:对象在控制台打印什么属性都没有
b、创建一个继承自某个父对象的子对象
前置问题
一个对象里有很多属性是不用的,加之在调式的属性过多,不便于调试
实现方法
- a空对象:Object.create(null)
- b情况:
var o1={ say:function(){} }
var o2=Object.create(o1);
此时,o2.__proto__===o1,没有构造函数
2 借用构造函数实现继承
场景:适用于2种构造函数之间逻辑有相似的情况
原理:函数的call、apply调用方式
局限性:Animal(父类构造函数)的代码必须完全适用于Person(子类构造器)
前置问题
有两构造函数,大部分属性极其相似,能否实现简化代码?
function Animal(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
function Person(name,age,gender,say){
this.name=name;
this.age=age;
this.gender=gender;
this.say=function(){}
}
错误的实现方式
为什么错误?
答:因为Animal(name,age,gender);这种函数的调用方式,函数内部的this只能指向window
<script>
function Animal(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
function Person(name,age,gender,say){
Animal(name,age,gender);
this.say=say;
}
var p1=new Person("name1",18,"女",
function(){
});
</script>
正确的实现方式
函数调用的目的:将Animal函数内部的this指向Person的实例
<script>
function Animal(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
function Person(name, age, gender, say) {
//Animal.call(this,name,age,gender)
//-->等价于:
Animal.apply(this, [name, age, gender])
this.say = say;
}
var p1 = new Person("name1", 18, "女",
function () {
});
</script>