ES5怎么实现继承?讲讲对原型链的理解
时间: 2024-10-08 16:09:05 浏览: 20
在ES5中,继承通常通过创建原型链来实现。有两种基本的继承模式:经典继承(prototypal inheritance)和构造函数继承(constructor-based inheritance)。
**经典继承(通过原型链)**:
```javascript
function Parent() {}
Parent.prototype.someMethod = function() {
//...
}
function Child() {}
Child.prototype = new Parent(); // 使用原型链将Child的原型指向Parent
Child.prototype.newMethod = function() {
//...
}
```
当创建一个 `Child` 实例时,它的原型会自动链接到 `Parent` 的实例,这样 `Child` 可以访问 `Parent` 的所有属性和方法,并且可以添加自己的特有属性和方法。
**原型链理解**:
每个JavaScript对象都有一个内部的[[Prototype]]属性,它引用了另一个对象,形成一条原型链。当我们试图访问一个对象的属性时,首先会在自身对象上查找,如果没有,则沿着原型链向上搜索,直到找到为止,或者到达原型链的顶端(全局对象,通常是`Object.prototype`),如果仍未找到则返回`undefined`。
当我们在一个对象上调用一个不存在的方法时,实际上是在查找原型对象上是否有这个方法。这就是为什么我们可以直接在函数上调用其他函数,因为函数也是对象,有自己的原型。
相关问题
ES5继承和ES6继承的方式和优缺点
ES5继承方式是通过原型链实现的,使用`Object.create()`方法创建一个新对象作为原型,然后将属性和方法添加到该对象上。ES6继承方式是通过`class`关键字和`extends`关键字实现的。
ES5继承方式的优点是简单易懂,容易理解和实现。缺点是原型链继承存在引用类型共享的问题,父类的引用类型属性被修改会影响子类实例的属性值。
ES6继承方式的优点是支持`super`关键字调用父类构造函数和方法,实现更加灵活;同时也支持`extends`关键字实现多层继承,避免了原型链继承的引用类型共享问题。缺点是语法复杂,需要使用`class`和`extends`关键字,需要了解更多面向对象编程的知识。
总的来说,ES5继承方式适用于简单的继承场景,ES6继承方式适用于复杂的继承场景,比如需要实现多层继承、需要修改父类方法或者需要调用父类构造函数。
阅读全文