Ответ 1
Мой вопроС# 1: Если это должно быть статичным, то не должно быть значения count 4,5,6 и т.д., так как все объекты имеют одну и ту же переменную счета?
Свойства прототипа разделяются между экземплярами, но если экземпляр имеет свою собственную копию свойства, он будет использовать это вместо этого. Присвоение свойства экземпляру дает ему свою собственную копию, и поэтому он больше не использует прототип.
+=
, ++
и аналогичные операторы приводят к назначению, поэтому они также вызывают это поведение.
Рассмотрим:
function Employee() {
}
Employee.prototype.count = 0;
Как и в предыдущем коде, для Employee.prototype
имеется объект в памяти. Некоторое искусство ASCII:
+−−−−−−−−−−−−−−−−−−−−+ | Employee.prototype | +−−−−−−−−−−−−−−−−−−−−+ | count: 0 | +−−−−−−−−−−−−−−−−−−−−+
Затем мы делаем следующее:
var e = new Employee();
Теперь есть второй объект в памяти, который ссылается на Employee.prototype
:
+−−−−−−−−−−−−−−−+ | e | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−+ | [[Prototype]] |−−−−−−−−−>| Employee.prototype | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−+ | count: 0 | +−−−−−−−−−−−−−−−−−−−−+
И если вы запросите e.count
:
console.log(e.count);
... так как e
не имеет собственного свойства, называемого count
, движок ищет прототип e
, чтобы найти его, найти и использовать это значение.
Однако, когда мы это делаем:
e.count += 1; // Or more idiomatically, `++e.count;` or `e.count++;`
Это присваивает значение count
в экземпляре e
. e
теперь имеет свою собственную копию count
:
+−−−−−−−−−−−−−−−+ | e | +−−−−−−−−−−−−−−−+ | count: 1 | +−−−−−−−−−−−−−−−−−−−−+ | [[Prototype]] |−−−−−−−−−>| Employee.prototype | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−+ | count: 0 | +−−−−−−−−−−−−−−−−−−−−+
Теперь, если вы запросите e.count
:
console.log(e.count);
... движок находит count
на e
и не смотрит на прототип.
Этот эффект можно увидеть в коде:
function Employee() {
}
Employee.prototype.count = 0;
var e = new Employee();
console.log(e.hasOwnProperty('count')); // false
e.count += 1;
console.log(e.hasOwnProperty('count')); // true
console.log(e.count); // 1
console.log(Employee.prototype.count); // 0