JavaScript 中的继承

作者 魏楷聪 发布于 2015年01月20日

1) 对象冒充(支持多重继承)

JavaScript 中的继承_第1张图片
继承的第一种方式:对象冒充

2) call方法方式

call方法是Function对象中的方法,因此我们定义的每个函数都有该方法。可以通过调用函数名来调用call方法,call方法的第一个参数会被传递给函数中的this,从第2个参数开始,逐一赋值给函数中的参数。

JavaScript 中的继承_第2张图片
使用call方式实现对象的继承

3) apply方法方式

JavaScript 中的继承_第3张图片
使用apply方式实现对象的继承

可以把 Child 的整个 arguments 对象作为第二个参数传递给 apply() 方法。当然,只有 Parent 中的参数顺序与 Child 中的参数顺序完全一致时才可以传递参数对象。如果不是,就必须创建一个单独的数组,按照正确的顺序放置参数。

4) 原型链方式(无法给构造函数传参数)

prototype对象是个模板,要实例化的对象都以这个模板为基础。总而言之,prototype对象的任何属性和方法都被传递给那个类的所有实例。

与对象冒充相似,子类的所有属性和方法都必须出现在prototype属性被赋值后,因为在它之前赋值的所有方法都会被删除。为什么?因为prototype属性被替换成了新对象,添加了新方法的原始对象将被销毁。

记住:原型链会用另一类型的对象重写类的prototype属性。

JavaScript 中的继承_第4张图片
使用原型链(prototype chain)方式实现对象继承

注意:调用 Parent 的构造函数时,没有给它传递参数。这在原型链中是标准做法。要确保构造函数没有任何参数。

对 Child 的所有实例,instanceof 为 Parent 和 Child 都返回 true。

var child = new Child();

alert(child instanceof Parent);  // outputs "true";

alert(child instanceof Child);  // outputs "true";

5) 混合方式(推荐)

JavaScript 中的继承_第5张图片
用对象冒充继承构造函数的属性
用原型链继承prototype对象的方法
由于混合方式使用了原型链,所以instanceof运算符仍能正确运行

小试牛刀:

JavaScript 中的继承_第6张图片
混合方式的运用

(完)

你可能感兴趣的:(JavaScript 中的继承)