Простой сценарий использования .prototype - PullRequest

Ответы [ 2 ]

3 голосов
/ 21 января 2011

В вашем примере код А является правильным, а код Б - нет.

Чтобы объяснить, мы можем думать о employee в трех разных аспектах:

  1. «Стандартный» сотрудник - набор значений по умолчанию, общий для всех новых сотрудников.Это форма, из которой мы создаем новых сотрудников.Например, зарплаты для новых сотрудников начинаются с нуля.
    • Это prototype.
  2. «конкретный» работник - скажем, Джон.Сначала он начинает с нулевой зарплаты (от «стандартного» сотрудника), но позже может получить собственную зарплату.У него также есть свое имя, должность и дата рождения, которые являются уникальными для него.
    • Уникальные свойства назначаются с помощью ключевого слова this в функции employee().
  3. Сотрудники в качестве группы - общие значения, которыехранятся не для каждого сотрудника, а для всех сотрудников одновременно, например, все сотрудники из компании A.
    • Это свойство задается непосредственно в функции employee.

Теперь, возвращаясь к вашим двум примерам кода,

employee.prototype.salary = null в коде A является правильным, поскольку он устанавливает начальную зарплату для «стандартного» сотрудника.

employee.salary = null в коде B неверен, поскольку устанавливает зарплату для всех сотрудников как группы, т. Е. Это не просто значение по умолчанию, а одинарное , общее значение для всех сотрудников.Неважно, что этот код находится внутри функции employee() - единственное отличие, которое делает функция, состоит в том, что он позволяет использовать ключевое слово this для ссылки на «конкретного» сотрудника, который в настоящее время создается в результатезвонить new employee().

1 голос
/ 21 января 2011

Во-первых, код A и B будут иметь разные результаты. Код A имеет конструктор для объекта и добавляет свойство к его прототипу. Это означает, что все экземпляры employee будут иметь поле с именем salary, которое является нулевым. Как и при обычном поведении свойств прототипа, если какой-либо из этих экземпляров записывает свойство, оно создает локальную копию для объекта.

Итак, используя код А:

var e = new employee('Bob', 'janitor', 1978);
alert(e.salary);  // null

var f = new employee('Alice', 'teacher', 1976);
f.salary = 20000;

alert(f.salary);  // 20000
alert(e.salary);  // null

В случае кода B ни один из экземпляров работника не будет иметь зарплату в качестве свойства, но конструктор, например, будет. employee.salary будет существовать и будет больше походить на статическую переменную класса в классическом наследовании. Вы можете сделать это, если хотите, чтобы значение было доступно для всех экземпляров, например employee.RETIREMENT_AGE = 65, но вы обычно делаете это после конструктора, а не в нем (вы назначаете одно и то же несколько раз).

...