es6 语法学习 - 原型模式
一、基本概念
原型设计模式(Prototype Pattern)是一种创建型设计模式,它通过复制已有的对象来创建新对象,而不是通过类的实例化。利用原型来实现对象的克隆,可以避免大量的构造过程,并且在一些情况下,创建新对象的时间和资源消耗大大减少。
二、 优点
- 避免昂贵的初始化:通过复制现有对象,可以避免大规模初始化的开销。
- 动态改变:可以在运行时动态改变对象的结构,便于在运行时创建复杂对象。
- 减少类的数量:可以通过组合的方式,利用原型拷贝来产生多种对象,而不需要定义多个类。
三、缺点
- 复杂性:克隆对象的流程可能会变得复杂,尤其是在对象嵌套或有多个依赖的情况下。
- 原型链问题:如果对象中有引用类型的属性,克隆时可能产生共享同一引用的问题。
四、使用场景
- 对象的创建成本较高或创建过程较复杂。
- 需要创建大量相似对象。
- 当需要通过一个已有实例来定义新对象,而不是通过类的实例化。
- 需要避免使用大量的新运算符(new)来创建对象实例,以节省资源和时间
五、示例代码
ES6 引入了类(class)语法,这是对原型模式的一种语法糖
// 定义一个基类(父类)
class Animal6 {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
// 定义一个子类,继承自Animal
class Dog6 extends Animal6 {
constructor(name, breed) {
super(name); // 调用父类的构造函数
this.breed = breed;
}
speak() {
// 重写父类的方法
console.log(`${this.name} the ${this.breed} dog6 barks.`);
}
}
// 创建Dog的实例
const d6 = new Dog6('Rex', 'German Shepherd');
d6.speak(); // 输出: Rex the German Shepherd dog barks.
在纯原型模式中,我们不使用class
关键字,而是直接操作对象的原型来创建新的对象类型。以下是一个简单的例子:
// 创建一个Animal对象作为原型
let Animal = {
type: 'Animal',
speak(name) {
console.log(`${name} makes a sound.`);
},
};
// 创建一个Dog对象,其原型设置为animal
const dog = Object.create(Animal);
dog.type = 'Dog';
dog.breed = 'German Shepherd';
// 重写Dog对象的speak方法
dog.speak = function (name, breed) {
console.log(`${name} the ${breed} dog barks.`);
};
// 调用speak方法时,需要手动传递name和breed参数
dog.speak('Rex', dog.breed); // 输出: Rex the German Shepherd dog barks.
在这个例子中,dog
对象通过Object.create(Animal)
创建,这意味着dog
的原型是Animal
。因此,dog
可以访问Animal
上定义的属性和方法。然而,这种方式的继承不如使用 ES6
类那样直观和强大,特别是当我们需要多重继承或更复杂的继承结构时。