Почему свойство прототипа объекта не переопределяет данный код - PullRequest
3 голосов
/ 28 марта 2020

const object = function() {};
object.prototype = {
  name: 'XYZ'
};
const o = new object();
object.prototype = {
  name: 'PQR'
}
const result = o.name;
console.log(result);

Здесь свойство name не переопределяет.

1 Ответ

5 голосов
/ 28 марта 2020

Когда вы переназначаете объект-прототип, другим объектам, созданным из этой функции, не будут изменены их внутренние цепочки прототипов, если вы явно не скажете Javascript сделать это - по уважительной причине, может быть очень дорогим :

Предупреждение : Изменение [[Prototype]] объекта по характеру того, как современные двигатели JavaScript оптимизируют доступ к свойствам, в настоящее время является очень медленной операцией в каждый браузер и JavaScript движок. Кроме того, эффекты изменения наследования являются тонкими и обширными и не ограничиваются просто временем, потраченным в операторе Object.setPrototypeOf (...), но могут распространяться на любой код, который имеет доступ к любому объекту, чей [ [Прототип]] был изменен.

Поскольку эта функция является частью языка, разработчикам движка по-прежнему приходится выполнять эту функцию эффективно (в идеале). Пока разработчики движка не решат эту проблему, если вы беспокоитесь о производительности, вам следует избегать установки [[Prototype]] объекта. Вместо этого создайте новый объект с нужным [[Prototype]] с помощью Object.create ().

Если у вас есть , используйте Object.setPrototypeOf в экземпляре , так что его внутренний прототип указывает на новый объект:

const object = function() {};
object.prototype = {
  name: 'XYZ'
};
const o = new object();
object.prototype = {
  name: 'PQR'
}
Object.setPrototypeOf(o, object.prototype);

const result = o.name;
console.log(result);

Но, надо надеяться, это следует делать только ради теоретического упражнения. Нет смысла делать это в фактическом коде, предназначенном для выполнения sh конкретной задачи.

...