跳转到内容

修改构造函数并继承原有的原型对象和方法

演示了如何在修改 Person 构造函数时继承原有的原型对象:

js
/**
 * 原始对象,创建一个新的Person对象。
 * @param {string} name - 新Person对象的名称。
 */
function Person(name) {
  this.name = name
}

/**
 * Person对象原型上的原始sayHi方法。
 * @param {string} message - 一个消息字符串。
 */
Person.prototype.sayHi = function(message) {
  console.log(`原始sayHi功能->我是${this.name},很高兴认识你。${message}, 我的名字是 ${this.name}.`)
}

/**
 * 该函数修改构造函数并继承原有的原型对象和方法。
 * @param {Function} originalConstructor - 要修改的原始构造函数。
 * @param {Function} modifyMethod - 修改构造函数原型对象的函数。
 * @returns {Function} - 新的修改后的构造函数。
 */
function modifyConstructor(originalConstructor, modifyMethod) {
  /**
   * 新的构造函数,在调用原始构造函数之前和之后添加了新的功能。
   * @param {...any} args - 传递给原始构造函数的参数。
   */
  function NewConstructor(...args) {
    // 在构造函数之前添加新的功能
    console.log(`正在创建一个新的 ${originalConstructor.name} 实例...`)
    // 调用原始的构造函数
    originalConstructor.apply(this, args)
    // 在构造函数之后添加新的功能
    console.log(`新的 ${originalConstructor.name} 实例已创建。`)
  }
  // 继承原型对象
  NewConstructor.prototype = Object.create(originalConstructor.prototype)
  NewConstructor.prototype.constructor = NewConstructor
  // 调用修改方法
  modifyMethod(NewConstructor.prototype)
  return NewConstructor
}

// 修改 Person 构造函数并修改 sayHi 方法
Person = modifyConstructor(Person, function(prototype) {
  const originalSayHi = prototype.sayHi
  prototype.sayHi = function(message) {
    originalSayHi.call(this, message)
    console.log(`给sayHi添加新功能->我是${this.name},很高兴认识你。`)
  }
})

// 创建一个新的 Person 实例
const person = new Person('Alice')

// 测试
person.sayHi('你好')