При создании объектов javascript объект «Объект» создается один раз и на него ссылается все __proto__? - PullRequest
0 голосов
/ 26 июня 2019

При создании объектов javascript объект «Объект» просто создается один раз и на него ссылаются все прото

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

1) Свойство __proto__ объекта указывает, какой объект использовался в качестве прототипа при его создании.

2) Поскольку __proto__ указывает на объект, это ссылка, потому что объекты всегда таковыхранятся в JavaScript, по ссылке.

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

4) Object - это встроенная функция, определенная только один раз.

5) Литералы объектовиметь __proto__ из Object.prototype (не Object):

const obj = {};
console.log(obj.__proto__ === Object.prototype); // true

Это потому, что создание литерала объекта - это то же самое, что и:

Object.create(Object.prototype)
0 голосов
/ 26 июня 2019

Да, всеобъемлющий объект «Объект» создается один раз, и на его прототипы ссылаются различные объекты JavaScript (JS), такие как массив или другие созданные объекты. Но если вы создали объект, который наследуется от другого созданного вами объекта суперкласса, его __proto__ сначала будет ссылаться на прототип объекта суперкласса в его цепочке прототипов.

Когда вы создаете объект и вызываете метод, JS ищет метод, проходя через цепочку прототипов. Если JS не находит метод в объекте, он попытается делегировать метод из суперкласса объекта. Если он все еще не находит метод, он делегирует еще один уровень и, в конечном итоге, объекту «Объект». Предположим, вы создали объект Person как суперкласс для объекта Hero:

let Person = function(name) {
    this.name = name;
}

Person.prototype.greet = function() {
    console.log("Hello, my name is " + this.name + ".")
}

let Hero = function(name) {
    Person.call(this, name);
}

Hero.prototype = Object.create(Person.prototype);
Hero.prototype.constructor = Hero;

Hero.prototype.fight = function(villain) {
    console.log("Hero, " + this.name + ", defeated " + villain + "!");
}

В строке Hero.prototype = Object.create(Person.prototype); вы разрешаете JS делегировать Person.prototype для Hero.prototype. Здесь Hero.prototype.__proto__ указывает на Person.prototype. Если метод не найден ни в Hero.prototype, ни в Person.prototype, то в конечном итоге он делегирует до Object.prototype, что находится в его цепочке прототипов [[Prototype]] (@RobG спасибо за разъяснение этого).

...