自定义继承:
何时: 只要默认的父对象不是想要的,就可更换
如何: 3种:
1. 修改一个对象的原型对象:
Object.setPrototypeOf(child,father)
修改child对象的__proto__,继承father
2. 批量修改所有子对象的父对象
只要修改构造函数的prototype=新父对象
强调: 必须在创建第一个新子对象之前,就修改。
3. 用一个已有的父对象作为参照,创建一个新子对象,同时,扩展子对象自有属性。
(ES5中最新提出的,本身不是继承的方法,是创建对象的方法)
var son=Object.create(父对象);
这句话做了2件事: 1. 创建空对象son
2. 设置son的__proto__指向父对象
var son=Object.create(父对象,{
扩展属性名1:{
writable:true,//是否可修改,可以省略
value:属性值,
configurable:true//可以设置,可以省略
},
扩展属性名2:{...}
});
何时使用:在创建一个子对象时,希望随意扩展子对象的自有属性时
4. 两种类型间的继承: 继承与扩展
何时: 只要两种类型间存在部分相同的属性结构和部分相同的方法
如何: 2步:
1. 抽象一个父类型:
定义父类型构造函数,集中定义两种类型间相同的属性结构
定义父类型原型对象,集中定义两种类型间相同的方法
2. 让子类型继承父类型:
让子类型原型对象继承父类型原型对象:
Object.setPrototypeOf(子类型.prototype, 父类型.prototype)
在子类型构造函数中借用父类型构造函数
如何借用:
错误做法: 父类型构造函数()
问题: 一个函数,不用new或.调用时,this->window
导致父类型构造函数中的属性都创建到全局window中
解决: 只要函数中this不是想要的,都可用call强行替换
正确做法: 父类型构造函数.call(obj,其他参数...)
其中obj是要替换this的对象