Skip to content

类相关

约 536 字大约 2 分钟

手撕前端

2025-08-30

/**
 * 手写new
 * @param {*} fn 构造函数
 * @param  {...any} args 参数
 * @returns 对象
 */
function myNew(fn, ...args) {
  let obj = {};
  Object.setPrototypeOf(obj, fn.prototype);
  fn.apply(obj, args);
  return obj;
}

instanceof

继承

原型链继承

/**
 * 原型链继承
 * 缺点:两个实例使用的是同一个原型对象,内存空间是共享的,在一个对象上修改父类原型上的数据,其他继承同一个父类的对象也会被改变
 * @param {*} Child 子类构造函数
 * @param {*} Parent 父类构造函数
 */
function myExtends1(Child, Parent) {
  Child.prototype = new Parent();
  Child.prototype.constructor = Child;
}

构造函数继承

/**
 * 构造函数继承
 * 缺点:无法继承原型上的属性和方法
 * @param {*} Child 子类构造函数
 * @param {*} Parent 父类构造函数
 */
function myExtends2(Child, Parent) {
  return function (...args) {
    Parent.call(this, ...args);
    Child.apply(this, args);
  };
}

组合继承

原型式继承

/**
 * 原型式继承
 * 缺点:因为是浅拷贝原型对象属性是共享的,多个实例会引用同一个原型对象
 * @param {*} obj 原型对象
 * @returns 新对象
 */
function myExtends4(obj) {
  return Object.create(obj);
}

寄生式继承

/**
 * 寄生式继承
 * 缺点:因为是浅拷贝原型对象属性是共享的,多个实例会引用同一个原型对象
 * @param {*} obj 原型对象
 * @returns 新对象
 */
function myExtends5(obj) {
  const clone = Object.create(obj);
  // 增加自己需要的方法
  clone.say = function () {
    console.log("Say");
  };
  return clone;
}

寄生组合式继承

贡献者

PinkDopeyBug

公告

本博客内容原本使用obsidian编写,由于没有仔细配置,以至图片引用使用obsidian风格。

且图片存储路径频繁变更导致部分文章图片无法正常显示。

为您带来不便请谅解。

ps:贡献者一直都只有wynnsimon一人,显示Pink的贡献者是因为我没好好配置git。后面因为懒就没一个个修改。如果被提及的人不希望被显示可以联系我我会立即删除。