从 extend 看 JS 继承
继承是面向对象编程中非常重要的一个概念,它可以让我们更好地组织代码并实现代码复用。在 JavaScript 中,我们可以使用 extend
方法来实现继承。本文将从 extend
方法的实现原理出发,详细介绍 JS 中的继承,包括原型链、构造函数继承、组合继承等,并结合示例代码进行讲解。
extend 实现原理
在 ES5 中没有内置的 extend
方法,我们通常需要通过手动实现来实现继承。以下是一个基本的 extend
实现:
-------- ---------------- ----------- - --- - - ---------- --- ----------- - --------------------- ------------------ - --- ---- ------------------------------ - --------- -
这个实现的原理是:创建一个空函数 F
,将父类的原型赋值给 F
的原型,然后将子类的原型指向 F
的实例,最后将子类的构造函数指向子类本身。这样一来,子类就继承了父类的所有属性和方法。
原型链继承
原型链继承是 JavaScript 中最基本的继承方式。其基本原理是通过让子类的原型对象指向父类的实例来实现继承。以下是一个原型链继承的示例代码:
-------- ------------ - --------- - ----- - ------------------------ - ---------- - --------------- ---- -- - - ----------- -- -------- --------- ---- - ----------------- ------ -------- - ---- - ------------- - --- --------- ------------------------- - ---- -------------------- - ---------- - -------------- -- - - -------- - - ----- ------ -- --- --- - --- --------- --- -------------- -- ------ ---- -- --- ------------- -- ----- -- - ----- ----
在这个示例中,我们定义了一个 Animal
类和一个 Dog
类,Dog
继承了 Animal
。在 Dog
的构造函数中,我们调用了 Animal
的构造函数来初始化一些属性。然后将 Dog
的原型对象指向了 Animal
的实例,这样 Dog
就可以访问和继承 Animal
的方法和属性了。
构造函数继承
构造函数继承是通过在子类的构造函数内部调用父类的构造函数,从而实现继承。以下是一个构造函数继承的示例代码:
-------- ------------ - --------- - ----- - ------------------------ - ---------- - --------------- ---- -- - - ----------- -- -------- --------- ---- - ----------------- ------ -------- - ---- - -------------------- - ---------- - -------------- -- - - -------- - - ----- ------ -- --- --- - --- --------- --- -------------- -- -------------- -- --- - -------- ------------- -- ----- -- - ----- ----
在这个示例中,我们定义了一个 Animal
类和一个 Dog
类,Dog
继承了 Animal
。在 Dog
的构造函数中,我们调用了 Animal
的构造函数来初始化一些属性。但是由于原型对象没有继承 Animal
的方法,所以在调用 dog.sayName()
的时候会报错。
组合继承
组合继承是将原型链继承和构造函数继承结合起来的一种方式。其基本原理是通过在子类的构造函数内部调用父类的构造函数,并将子类
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/10730