Как работает JavaScript .prototype? - PullRequest
1948 голосов
/ 21 февраля 2009

Я не очень разбираюсь в языках динамического программирования, но я написал свою долю кода JavaScript. Я никогда не думал об этом программировании на основе прототипов, кто-нибудь знает, как это работает?

var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();

Я помню много обсуждений, которые у меня были с людьми некоторое время назад (я не совсем уверен, что я делаю), но, насколько я понимаю, понятия класса нет. Это просто объект, и экземпляры этих объектов являются клонами оригинала, верно?

Но какова точная цель этого свойства ".prototype" в JavaScript? Какое отношение это имеет к созданию объектов?

Обновление: правильный путь

var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!

function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK

Также эти слайды действительно очень помогли.

Ответы [ 25 ]

4 голосов
/ 18 августа 2018

Резюме:

  • Функции являются объектами в javascript и поэтому могут иметь свойства
  • (Конструктор) функции всегда имеют свойство прототипа
  • Когда функция используется в качестве конструктора с ключевым словом new, объект получает прототип. Ссылку на этот прототип можно найти в свойстве __proto__ вновь созданного объекта.
  • Это свойство __proto__ относится к свойству prototype функции конструктора.

Пример:

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

let me = new Person('willem');

console.log(Person.prototype) // Person has a prototype property

console.log(Person.prototype === me.__proto__) // the __proto__ property of the instance refers to prototype property of the function.

Почему это полезно:

Javascript имеет механизм поиска свойств на объектах, который называется «наследование прототипа» , вот что в основном делает:

  • Сначала проверяется, находится ли свойство на самом объекте. Если это так, это свойство возвращается.
  • Если свойство не находится на самом объекте, оно «поднимется по проточине». Он в основном смотрит на объект, на который ссылается свойство proto . Там он проверяет, доступно ли свойство для объекта, на который ссылается proto
  • Если свойство не находится на объекте proto , оно поднимется вверх по цепочке proto до объекта Object.
  • Если он не может найти свойство нигде в объекте и его цепочке прототипов, он вернет неопределенное.

Например:

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

let mySelf = new Person('Willem');

console.log(mySelf.__proto__ === Person.prototype);

console.log(mySelf.__proto__.__proto__ === Object.prototype);

Обновление:

Свойство __proto__ устарело, хотя оно реализовано в большинстве современных браузеров, но лучший способ получить ссылку на объект-прототип:

Object.getPrototypeOf()

3 голосов
/ 02 августа 2018

другая схема, показывающая __proto __ , прототип и конструктор отношения: enter image description here

2 голосов
/ 25 декабря 2018

Прототип создает новый объект путем клонирования существующего объекта . Так что на самом деле, когда мы думаем о прототипе, мы можем действительно думать клонировать или делать копию чего-либо, вместо того, чтобы делать это.

2 голосов
/ 01 февраля 2018

Просто у вас уже есть объект с Object.new, но у вас все еще нет объекта при использовании синтаксиса конструктора.

0 голосов
/ 21 января 2019

Важно понимать, что существует различие между прототипом объекта (который доступен через Object.getPrototypeOf(obj) или через устаревшее свойство obj.__proto__) и свойством prototype в функциях конструктора. Первый является свойством каждого экземпляра, а второй - свойством конструктора. То есть Object.getPrototypeOf(new Foobar()) относится к тому же объекту, что и Foobar.prototype.

Ссылка: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...