У чому сенс методу-прототипу?


10

Я читаю через Javascript: Хороші частини , і намагався обвести голову навколо розділу про прототипи .

Трохи погуглившись, я прийшов до висновку, що це додати властивості до об’єктів після оголошення об’єктів.

Використовуючи цей скрипт, що сяяв від w3schools, я помітив, що видалення рядка, що додає властивість прототипу, не впливає . Тож який сенс?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);


4
@Raynos добре сказано, але пропонуйте також заміну, наприклад, документи MDN: developer.mozilla.org/en/JavaScript
StuperUser

Відповіді:


13

Так не працює прототип. Прототип використовується в ланцюзі прототипу.

Кожен раз, коли ви намагаєтеся отримати властивість на об'єкт, він перевірятиме об’єкт на ім'я цього властивості. Якщо його немає, він буде шукати в прототипі.

Приклад:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Тож суть прототипу полягає у простому повторному використанні та успадкуванні коду.


Гаразд, тому я зараз це розумію. Але я намагався додати властивість динамічно, і це мені говорить prototype is undefined---o.prototype.newProp = "mutts nuts";
Невеликий нечіткий сен

3
@MildFuzz o- об’єкт. .prototypeВластивість використовується у функціях, ігнорувати його. Просто зробітьo.newProp = "mutts nuts"
Райнос

7

Коли ви зробили, fred.salary=20000ви додали атрибут зарплати лише до fred. Під час використання прототипу всі співробітники, які ви будете створювати з цього часу, матимуть атрибут зарплати.

Скажімо, у вас є 100 примірників працівників, і ви хотіли додати до них атрибут зарплати. Ви можете це зробити вручну, переглядати кожного співробітника і додавати його. Або ви можете використати прототип і встановити, якщо для всіх них.

Прототип корисний, коли ви хочете функціонувати щось, що вже існує. Скажіть, ви хочете додати до масивів користувацький метод. Ви б робили щось на кшталт:

Array.prototype.my_custom_method = function() {...}

З цього моменту всі масиви, які ви будете створювати, матимуть цей метод.


3
Я здивований, що ніхто не згадував, що це створено для того, щоб зменшити використання пам'яті. Якщо вам потрібно реалізувати складний об'єкт, який містить багато коду, ви не хочете, щоб код повторювався в кожному екземплярі об'єкта. Очевидно, що властивості даних, швидше за все, будуть різними у кожному випадку, але зазвичай ви хочете лише одну копію коду, тому ви помістите його в прототип.
Домінік Кронін

1
IMO це найкраща відповідь на сьогоднішній день.
Людина

5

Ви можете поглянути на цю статтю .

Мова, заснована на прототипі, має поняття прототипного об'єкта, об'єкта, який використовується як шаблон, з якого можна отримати початкові властивості нового об’єкта. Будь-який об'єкт може вказати власні властивості, коли ви створюєте його, так і під час виконання. Крім того, будь-який об'єкт може бути асоційований як прототип для іншого об'єкта, дозволяючи другому об'єкту ділитися властивостями першого об'єкта.

Якщо ви додаєте властивість до об'єкта, який використовується в якості прототипу для набору об'єктів, об'єкти, для яких це прототип, також отримують нове властивість.

Це одна з головних переваг мови, заснованої на прототипі, перед мовою на основі класів.

Крім того, легко отримати класичне успадкування OO з JS, якщо вам потрібно, але часто складно отримати прототип-модель для мови, яка не реалізує її за замовчуванням.


3
+1 для статті мов на основі класу проти прототипу
adivasile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.