Spec-Zone.ru › JavaScript

Object.create()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Статический метод Object.create() создает новый объект, используя существующий объект в качестве прототипа вновь создаваемого объекта.

Попробуйте

const person = {
  isHuman: false,
  printIntroduction() {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  },
};

const me = Object.create(person);

me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // Inherited properties can be overwritten

me.printIntroduction();
// Expected output: "My name is Matthew. Am I human? true"

Синтаксис

Object.create(proto)
Object.create(proto, propertiesObject)

Параметры

proto
Объект, который должен быть прототипом вновь созданного объекта.
propertiesObject Необязательный
Если указан и не является undefined, объект, чьи перечислимые собственные свойства определяют дескрипторы свойств, которые будут добавлены к вновь созданному объекту, с соответствующими именами свойств. Эти свойства соответствуют второму аргументу Object.defineProperties().

Возвращаемое значение

Новый объект с указанным объектом-прототипом и свойствами.

Исключения

TypeError
Выбрасывается, если proto не является ни null, ни Object.

Примеры

Классическое наследование с Object.create()

Ниже приведен пример использования Object.create() для достижения классического наследования. Это для одиночного наследования, которое является единственным, поддерживаемым JavaScript.

// Shape - superclass
function Shape() {
  this.x = 0;
  this.y = 0;
}

// superclass method
Shape.prototype.move = function (x, y) {
  this.x += x;
  this.y += y;
  console.info("Shape moved.");
};

// Rectangle - subclass
function Rectangle() {
  Shape.call(this); // call super constructor.
}

// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype, {
  // If you don't set Rectangle.prototype.constructor to Rectangle,
  // it will take the prototype.constructor of Shape (parent).
  // To avoid that, we set the prototype.constructor to Rectangle (child).
  constructor: {
    value: Rectangle,
    enumerable: false,
    writable: true,
    configurable: true,
  },
});

const rect = new Rectangle();

console.log("Is rect an instance of Rectangle?", rect instanceof Rectangle); // true
console.log("Is rect an instance of Shape?", rect instanceof Shape); // true
rect.move(1, 1); // Logs 'Shape moved.'

Обратите внимание, что при использовании create() есть нюансы, на которые следует обратить внимание, например, повторное добавление свойства constructor для обеспечения правильной семантики. Хотя Object.create() считается более производительным, чем изменение прототипа с помощью Object.setPrototypeOf(), разница на самом деле незначительна, если экземпляры не были созданы и доступы к свойствам еще не оптимизированы. В современном коде в любом случае следует предпочитать синтаксис class.

Использование аргумента propertiesObject с Object.create()

Object.create() позволяет тонко настраивать процесс создания объекта. Фактически, синтаксис инициализатора объектов является синтаксическим сахаром для Object.create(). С помощью Object.create() мы можем создавать объекты с назначенным прототипом, а также некоторыми свойствами. Обратите внимание, что второй параметр сопоставляет ключи с дескрипторами свойств — это означает, что вы можете контролировать перечислимость, настраиваемость и т. д. каждого свойства, чего вы не можете сделать в инициализаторах объектов.

o = {};
// Is equivalent to:
o = Object.create(Object.prototype);

o = Object.create(Object.prototype, {
  // foo is a regular data property
  foo: {
    writable: true,
    configurable: true,
    value: "hello",
  },
  // bar is an accessor property
  bar: {
    configurable: false,
    get() {
      return 10;
    },
    set(value) {
      console.log("Setting `o.bar` to", value);
    },
  },
});

// Create a new object whose prototype is a new, empty
// object and add a single property 'p', with value 42.
o = Object.create({}, { p: { value: 42 } });

С помощью Object.create() мы можем создать объект с null в качестве прототипа. Эквивалентный синтаксис в инициализаторах объектов — это ключ __proto__.

o = Object.create(null);
// Is equivalent to:
o = { __proto__: null };

По умолчанию свойства не являются записываемыми, перечислимыми или настраиваемыми.

o.p = 24; // throws in strict mode
o.p; // 42

o.q = 12;
for (const prop in o) {
  console.log(prop);
}
// 'q'

delete o.p;
// false; throws in strict mode

Чтобы указать свойство с теми же атрибутами, что и в инициализаторе, явно укажите writable, enumerable и configurable.

o2 = Object.create(
  {},
  {
    p: {
      value: 42,
      writable: true,
      enumerable: true,
      configurable: true,
    },
  },
);
// This is not equivalent to:
// o2 = Object.create({ p: 42 })
// which will create an object with prototype { p: 42 }

Вы можете использовать Object.create() для имитации поведения оператора new.

function Constructor() {}
o = new Constructor();
// Is equivalent to:
o = Object.create(Constructor.prototype);

Конечно, если в функции Constructor есть фактический код инициализации, метод Object.create() не сможет его отразить.

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-object.create

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
create
5
12
4
11.6
5
18
4
12
5
1.0
4.4
5
1.0.0
1.0
0.10.0

См. также

  • Polyfill Object.create в core-js
  • Object.defineProperty()
  • Object.defineProperties()
  • Object.prototype.isPrototypeOf()
  • Reflect.construct()
  • Object.getPrototypeOf от John Resig (2008)

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API