Skip to content

手写实现 Object.create

Posted on:2024年8月23日 at 05:23

Object.create 方法用于创建一个新对象,使用指定的原型对象和可选的属性描述符来初始化新对象。手写实现 Object.create 涉及到设置新对象的原型并定义可选的属性。

以下是 Object.create 的简单手写实现:

实现

function create(proto, propertiesObject) {
  // 创建一个临时构造函数
  function Temp() {}

  // 将临时构造函数的原型指向指定的原型对象
  Temp.prototype = proto;

  // 创建新对象,并设置其原型
  const obj = new Temp();

  // 如果传入了属性描述符对象,则使用 Object.defineProperties 来定义属性
  if (propertiesObject !== undefined) {
    Object.defineProperties(obj, propertiesObject);
  }

  return obj;
}

// 示例用法
const personPrototype = {
  greet() {
    console.log("Hello!");
  },
};

const john = create(personPrototype, {
  name: {
    value: "John",
    writable: true,
    configurable: true,
    enumerable: true,
  },
  age: {
    value: 30,
    writable: true,
    configurable: true,
    enumerable: true,
  },
});

console.log(john.name); // 输出: John
john.greet(); // 输出: Hello!

说明

  1. 临时构造函数

    function Temp() {}
    
    • 创建一个临时构造函数 Temp 用于设置新对象的原型。这个构造函数不会有实际的功能,只是为了创建一个新对象来设置原型链。
  2. 设置原型

    Temp.prototype = proto;
    
    • Temp.prototype 设置为传入的原型对象 proto。这样,通过 new Temp() 创建的新对象就会具有指定的原型。
  3. 创建新对象

    const obj = new Temp();
    
    • 使用临时构造函数 Temp 创建一个新对象 obj,其原型链上会包含 proto
  4. 定义属性(可选):

    if (propertiesObject !== undefined) {
      Object.defineProperties(obj, propertiesObject);
    }
    
    • 如果传入了属性描述符对象 propertiesObject,使用 Object.defineProperties 方法来定义新对象的属性。这样可以设置属性的值、是否可写、是否可配置等。
  5. 返回新对象

    return obj;
    
    • 返回创建的新对象。
原文转自:https://fe.ecool.fun/topic/deb33950-f22a-42f5-ac23-2eb30148d107