Может ли объект иметь свойства, которых нет у его прототипа? - PullRequest
1 голос
/ 10 мая 2019

В JavaScript должен ли объект и его прототип (то есть его свойство prototype как объект) иметь одинаковый набор свойств?

Может ли объект иметь свойства, которых нет у его прототипа?

Ответы [ 2 ]

4 голосов
/ 10 мая 2019

В JavaScript должен объект и его прототип (т.е. его свойство прототип как объект) имеет точно такой же набор свойств?

Нет. prototype используется для создания экземпляров объектов. В момент создания экземпляра экземпляр становится отдельным объектом от прототипа, и его модификации не влияют на прототип (однако изменения в прототипе будут влиять на экземпляр). Добро пожаловать в прототип наследования !

Может ли объект иметь свойства, которых нет у его прототипа?

Да , вот пример:

function foo(){
  // doesn't matter what it does
}

let fooInstance = new foo();

console.log(foo.prototype.bar); // undefined
console.log(fooInstance.bar);   // undefined
console.log("************************");

// Give the instance object a new property.
// This does not create a property on the instance's prototype
fooInstance.bar = "baz";

console.log(foo.prototype.bar); // undefined
console.log(fooInstance.bar);   // baz
console.log("************************");

console.log(foo.prototype.hasOwnProperty("bar"));  // false
console.log(fooInstance.hasOwnProperty("bar"));    // true
1 голос
/ 10 мая 2019

В случае, если вам нужно придерживаться прототипа, вы можете seal() объект.Метод Object.seal() запечатывает объект, предотвращая добавление к нему новых свойств и помечая все существующие свойства как неконфигурируемые.Значения существующих свойств все еще можно изменять, пока они доступны для записи.

Object.seal () Определение MDN

Вы также можете freeze() Объект, ноэто предотвратит изменение любой части объекта.

...