В чем смысл способа-прототипа?


10

Я читаю Javascript: The Good Parts и изо всех сил пытался разобраться с разделом о прототипах .

После небольшого гугла я пришел к выводу, что добавление свойств к объектам происходит после объявления объектов.

Используя этот скрипт из w3schools, я заметил, что удаление строки, добавляющей свойство prototype, не имеет никакого эффекта . Так в чем смысл?


//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 docs: 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";
Mild Fuzz

3
@MildFuzz o- это объект. .prototypeСвойство используется в функциях, игнорировать его. Просто сделайo.newProp = "mutts nuts"
Райнос

7

Когда вы сделали, fred.salary=20000вы добавили атрибут зарплаты только для Фреда. При использовании прототипа все сотрудники, которых вы создадите, будут иметь атрибут зарплаты.

Допустим, у вас есть 100 экземпляров сотрудников, и вы хотите добавить атрибут зарплаты для всех них. Вы можете сделать это вручную, перебрать каждого сотрудника и добавить его. Или вы можете использовать прототип и установить, если для всех из них.

Прототип полезен, когда вы хотите использовать функциональность для того, что уже существует. Допустим, вы хотите добавить собственный метод в массивы. Вы бы сделали что-то вроде:

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

С этого момента все массивы, которые вы создадите, будут иметь этот метод доступным.


3
Я удивлен, что никто не упомянул, что это разработано, чтобы уменьшить использование памяти. Если вам нужно реализовать сложный объект с большим количеством кода, вы не хотите, чтобы код повторялся в каждом экземпляре объекта. Очевидно, что свойства данных с большей вероятностью будут разными в каждом случае, но обычно вам требуется только одна копия кода, поэтому вы помещаете ее в прототип.
Доминик Кронин

1
ИМО, это лучший ответ на сегодняшний день.
Маффин Человек

5

Возможно, вы захотите взглянуть на эту статью .

Основанный на прототипе язык имеет понятие прототипного объекта, объекта, используемого в качестве шаблона, из которого можно получить начальные свойства для нового объекта. Любой объект может указывать свои собственные свойства, либо при его создании, либо во время выполнения. Кроме того, любой объект может быть связан как прототип для другого объекта, что позволяет второму объекту совместно использовать свойства первого объекта.

Если вы добавляете свойство к объекту, который используется в качестве прототипа для набора объектов, объекты, для которых он является прототипом, также получают новое свойство.

Это одно из главных преимуществ языка, основанного на прототипах, по сравнению с языками классов.

Кроме того, легко получить классическое наследование ОО с помощью JS, если это необходимо, но зачастую трудно получить модель-прототип для языка, который не реализует его по умолчанию.


3
+1 за статью на основе
классов и
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.