js 本身没有类的概念.通过构造函数 和new 来创建实例对象.只能通过对象间的关联实现继承,也就是通过prototype.
在js里所谓的继承 就是将父所有公有方法属性传递给子. 因为js没有访问修饰符.所以,只能选择性传递.
- 第一种. 将父的实例赋值给子的prototype
function parent(){
this.name = 'parent'
}
parent.prototype.say = ()=>console.log('hello')
function son(){ }
son.prototype = new parent()
缺点.每个子类里保存一个父的实例,浪费内存.创建子类实例时,不能向父类构造函数中传参数
- 第二种. 将子的prototype 和父的prototype 链接.
一般父想要暴漏给子的方法,都写在prototype里,所以只需要能访问到父的prototype就可以了. 构造函数上的prototype的constructor的值指向构造函数的本身.
可以通过实例.proto.constructor来判断他的构造方法.
function fn(){}
var fn = new fn();
console.log(fn.constructor)
function parent(){
this.name = 'parent'
}
parent.prototype.say = ()=>console.log('hello')
function son(){ }
son.prototype = parent.prototype;
son.prototype.constructor = parent
缺点:子构造函数,和父构造函数共享的一个prototype .在修改时会相互影响.
- 第三种:结合以上两种方法的 创建一个新的构造函数fn 将fn.prototype 指向父的prototype .将子的prototype 指向fn的实例
function parent(){
this.name = 'parent'
}
parent.prototype.say = ()=>console.log('hello')
function son(){ }
function extendFn(son,parent){
let fn = function(){}
fn.prototype = parent.prototype;
son.prototype = new fn();
son.prototype.constructor= son;
}
- 第四种 在子构造函数执行父构造函数并指向子
function parent(){
this.name = 'parent'
}
parent.prototype.say = ()=>console.log('hello')
function son(){
parent.call(this)
}
缺点:无法继承父构造函数的prototype
instanceof 的作用是 查看 构造函数的prototype 是否出现在 实例对象的原型链上
网友评论