本文实例讲述了JS原型与继承操作。分享给大家供大家参考,具体如下:
[removed]
var Beverage = function(){};
Beverage.prototype.boilWater = function(){
console.log("把水煮沸");
};
Beverage.prototype.brew = function(){
throw new Error("子类必须重写该方法");
};
Beverage.prototype.pourInCup = function(){
throw new Error("子类必须重写该方法");
};
Beverag
JavaScript中的原型和继承是两种核心概念,它们是实现面向对象编程的关键。在JavaScript中,所有对象都有一个内部属性`[[Prototype]]`,通常通过`__proto__`或`Object.getPrototypeOf`来访问,这个属性链接到创建该对象的构造函数的原型。原型对象又包含了一组可枚举的属性和方法,这些属性和方法可以被对象实例共享。
在这个示例中,我们首先定义了一个基础饮料类`Beverage`,它有一些基础操作,如`boilWater`、`brew`、`pourInCup`和`addCondiments`。其中,`brew`、`pourInCup`和`addCondiments`方法都是抽象方法,它们在`Beverage`中抛出错误,提示子类必须重写这些方法。`customerWantsCondiments`方法默认返回`true`,表示客户通常想要调料。
接下来,我们创建了两个子类`Coffee`和`Tea`,它们通过以下方式继承自`Beverage`:
```javascript
Coffee.prototype = new Beverage();
Tea.prototype = new Beverage();
```
这种继承方式(也称为经典继承)会使得`Coffee`和`Tea`的原型链上包含一个`Beverage`实例,因此它们可以访问`Beverage`的所有方法。然后,这两个子类重写了父类中的抽象方法,以实现各自特定的饮料制作过程。
在实例化`Coffee`和`Tea`对象后,我们调用`init`方法来执行饮料制作流程。`init`方法包含了制作饮料的基本步骤,并根据`customerWantsCondiments`的结果决定是否添加调料。对于`Tea`,我们还修改了`customerWantsCondiments`方法,使其成为一个交互式的确认过程。
在JavaScript中,原型继承是通过原型链实现的,当试图访问一个对象的属性时,如果该对象本身没有这个属性,那么JavaScript会向上查找其`__proto__`,直到找到该属性或者查找到原型链的顶端(即`null`),如果没有找到则返回`undefined`。这种方式允许子类继承父类的属性和方法,并可以进行扩展和重写。
这个示例还展示了如何在浏览器环境中运行JavaScript代码,通过HTML中的`<script>`标签嵌入脚本,以及使用在线代码运行工具进行测试和调试。
理解JavaScript的原型和继承机制对于编写高效的面向对象代码至关重要。它们允许你创建可复用的代码模块,提高代码的组织性和可维护性。在这个示例中,`Beverage`作为一个基础类,提供了通用的功能,而`Coffee`和`Tea`作为子类,可以利用继承特性实现各自的特有功能,同时保持代码的整洁和模块化。