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!
说明
-
临时构造函数:
function Temp() {}
- 创建一个临时构造函数
Temp
用于设置新对象的原型。这个构造函数不会有实际的功能,只是为了创建一个新对象来设置原型链。
- 创建一个临时构造函数
-
设置原型:
Temp.prototype = proto;
- 将
Temp.prototype
设置为传入的原型对象proto
。这样,通过new Temp()
创建的新对象就会具有指定的原型。
- 将
-
创建新对象:
const obj = new Temp();
- 使用临时构造函数
Temp
创建一个新对象obj
,其原型链上会包含proto
。
- 使用临时构造函数
-
定义属性(可选):
if (propertiesObject !== undefined) { Object.defineProperties(obj, propertiesObject); }
- 如果传入了属性描述符对象
propertiesObject
,使用Object.defineProperties
方法来定义新对象的属性。这样可以设置属性的值、是否可写、是否可配置等。
- 如果传入了属性描述符对象
-
返回新对象:
return obj;
- 返回创建的新对象。