首先继承的概念就不讲了,目的使用最少的语言描述最全的知识
function Parent(){}
function Son(){}
Son.prototype=new Parent()
存在的问题,new 多个对象的时候,其指向的是一个地址,内存是共享的
function Parent(){}
Parent.prototype.func=function(){
}
function Son(){
Parent.call(this)
}
存在的问题 原型上的方法无法继承
function Parent(){
this,name="lkzwc"
}
function Son(){
Parent.call(this)
}
Parent.prototype.run=function(){
console.log("runing" + this.name)
}
Son.prototype=new Parent()
let son = new Son()
son.run()
存在的问题 构造多次执行,开销更大了
function Parent(){}
function Son(){}
let son = Object.create(new Parent())
虽然本质上和原型继承没有区别,只是再其浅拷贝的基础之上,增加了一些方法
function Parent(){}
function Son(){}
function clone(source){
let new = Object.create(source)
new.run=function(){
return this.name
}
return new
}
function Parent(){
this,name="lkzwc"
}
function Son(){
Parent.call(this)
}
Parent.prototype.run=function(){
console.log("runing" + this.name)
}
function clone(par,son){
son.prototype = Object.create(par.prototype)
son.prototype.constructor =son
}
clone(Parent,Son)
let son = new Son()
其底层实现依旧是寄生组合 使用 bable 处理后的代码
function _possibleConstructorReturn (self, call) {
return call && (typeof call === 'object' || typeof call === 'function') ? call : self;
}
function _inherits (subClass, superClass) {
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var Parent = function Parent () {
// 验证是否是 Parent 构造出来的 this
_classCallCheck(this, Parent);
};
var Child = (function (_Parent) {
_inherits(Child, _Parent);
function Child () {
_classCallCheck(this, Child);
return _possibleConstructorReturn(this, (Child.__proto__ || Object.getPrototypeOf(Child)).apply(this, arguments));
}
return Child;
}(Parent));