我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有的对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。
// 创建一个构造函数function Person(name, age) {this.name = name;this.age = age;}// 在Person的原型上添加方法Person.prototype={speck:function(){console.log("我的姓名是 " + this.name + " 年纪 " + this.age);},}// 创建Person的实例var person1 = new Person("张三", 25);var person2 = new Person("李四", 30);// 调用原型上的方法person1.speck(); // 输出: 我的姓名是 张三 年纪 25person2.speck(); // 输出: 我的姓名是 李四 年纪 30
定义了一个Person构造函数,它接受name和age作为参数,并将它们赋值给新创建的对象的name和age属性。然后在Person的原型上添加了一个speck方法。这样通过new Person()创建的实例都将继承这个方法。最后,我们创建了两个Person的实例,并调用了它们的speck方法。
使用ES6创建
// 使用ES6的class关键字定义一个Car类class Car {constructor(color, make, model) {// 在构造函数中定义实例属性this.color = color;this.make = make;this.model = model;}// 在类上定义方法,这些方法会成为原型方法startEngine() {console.log('startEngine!');}stopEngine() {console.log('stopEngine!');}describe() {console.log(` ${this.color} ${this.make} ${this.model}.`);}}// 创建Car类的实例const myCar = new Car('宝石蓝', '拖拉机', 'S500');const anotherCar = new Car('蓝宝石', '三轮车', 'S600');// 调用实例方法myCar.startEngine(); // 输出:startEngineanotherCar.startEngine(); // 输出: startEnginemyCar.describe(); // 输出: 宝石蓝 拖拉机 S500anotherCar.describe(); // 输出: 蓝宝石 三轮车 S600myCar.stopEngine()// 输出: stopEngineanotherCar.stopEngine(); // 输出: stopEngine
使用 class 关键字定义了一个名为 Car 的类。类定义中包含了一个 constructor 方法,它是类的构造函数,用于初始化新创建的对象实例。在 constructor 方法中,我们定义了 color、make 和 model 这三个实例属性,并将传入的参数值赋给它们。在类定义中直接定义的方法(如 startEngine、stopEngine 和 describe)会自动成为类的原型方法。这意味着所有通过 new Car(...) 创建的实例都会继承这些方法。使用 new 关键字和类名 Car 创建类的实例。每个实例都会有自己的 color、make 和 model 属性值。与ES5中的原型模式一样,我们可以直接通过实例来调用定义在类上的方法。