es6 语法学习 - 原型模式

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 类那样直观和强大,特别是当我们需要多重继承或更复杂的继承结构时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值