1、通过 obj.call() 或 obj.apply() 改变函数上下文实现继承 (该种方式不能继承原型链)
2、通过原型链 prototype 方式
// 以下演示 call() 和 prototype 方式,apply() 和call方式一样,只不过有参数的话,参数是数组
function fnA() {
this.name = 'zhangsan';
this.age = 23;
}
fnA.prototype.say = function() {
console.log( this.name );
}
function fnB() {
fnA.call(this);
//通过call方式继承 fnA 的属性,
//call和apply只能继承构造函数里面的属性,对于prototype的扩展属性或方法不能继承
this.addr = '金牛区'
}
// 要继承fnA的prototype原型链方法,需要如下
fnB.prototype = Object.create( fnA.prototype ); //es5 新方法
fnB.prototype.constructor = fnB;
------------------------------------------------------------------------------
//第2种方式,基于prototype原型继承
fnB.prototype = new fnA(); //通过new fnA() 就把fnA的全部属性和prototype原型都继承过来了
fnB.prototype.constructor = fnB; //重新将构造函数指向原型fnB
var a = new fnA();
var b = new fnB();
console.log( b.addr );
//如果没有重新指向构造函数,b的原型constructor指向 fnA
console.log( b.constructor.name );