object.create用于创建指定原型的新对象:传入原型对象返回[[prototype]]指向该对象的新空对象;支持属性描述符初始化自有属性;传null可创建无原型对象;首参必须为对象或null,否则报错。

直接用 Object.create 传入目标原型对象即可,它会返回一个新对象,其内部 [[Prototype]] 指向你传入的对象。
基本用法:指定原型并创建空对象
这是最常见场景:你有一个对象想作为新对象的原型,不希望新对象有自身属性。
- 语法:
Object.create(prototypeObj) -
prototypeObj必须是对象或null(不能是原始值) - 返回的新对象没有自有属性,但可访问原型上的属性和方法
例如:
const animal = {
speak() { console.log('Animal speaks'); }
};
const dog = Object.create(animal);
dog.speak(); // 'Animal speaks'
console.log(dog.__proto__ === animal); // true
带属性描述符:初始化自有属性
第二个参数是属性描述符对象,可为新对象定义自有属性(如 value、writable、enumerable 等)。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 格式类似
Object.defineProperty的第三个参数 - 每个键对应新对象的一个自有属性,值是描述符对象
- 不影响原型链,只设置新对象自身的属性
例如:
const personProto = {
greet() { return `Hello, I'm ${this.name}`; }
};
const john = Object.create(personProto, {
name: { value: 'John', writable: true, enumerable: true },
age: { value: 30, writable: false, enumerable: true }
});
console.log(john.greet()); // 'Hello, I'm John'
console.log(john.name); // 'John'
console.log(john.age); // 30
创建无原型对象:用 null 作为原型
如果不想继承任何东西(包括 Object.prototype 上的方法),可传 null。
- 返回的对象没有
toString、hasOwnProperty等默认方法 - 适合做纯数据容器或避免原型污染的场景
- 需手动添加所需方法,或用
Object.assign合并属性
例如:
const obj = Object.create(null); // obj.toString(); // TypeError: obj.toString is not a function obj.data = 'safe'; console.log(obj.data); // 'safe'
注意点:别误传 undefined 或原始值
Object.create 对第一个参数校验严格:
- 传
undefined、number、string等会直接报错:TypeError: Object prototype may only be an Object or null - 传
{}是合法的(空对象可作原型) - 不确定时可用
Object.getPrototypeOf(obj)查看当前原型










