Класс .prototype.method vs this.prototype.method
Я всегда видел примеры класса Class.prototype.method, но никогда не использовал this.prototype.method. Например:
function Class() {
this.prototype.method = function() {
alert("is this allowed?");
};
}
против
function Class() {}
Class.prototype.method = function() {
alert("traditional example");
};
- Существует ли этот.протоп?
- Это то же самое, что и Class.prototype?
- Как насчет наследования?
Ответы
Ответ 1
-
Существует ли этот. прототип?
Нет. Но this.constructor.prototype
должен.
-
Это то же самое, что и класс (.constructor).prototype?
Как правило, оно имеет такое же значение (пока this.constructor === Class
), но не такое же намерение.
-
Как насчет наследования?
Каждый экземпляр new Class
наследует от Class.prototype
. Таким образом, объект prototype
хорош для определения общих значений, доступных для всех экземпляров. Затем конструктор должен просто настроить состояние, уникальное для каждого экземпляра.
Но при попытке смешать 2 и установить свойство prototype
внутри конструктора есть несколько проблем, в том числе конфликт с курицей или яйцом, поскольку метод не будет существовать до тех пор, пока не будет создан первый экземпляр:
function Class() {
this.constructor.prototype.method = function () {};
}
console.log(typeof Class.prototype.method); // "undefined"
var a = new Class();
console.log(typeof Class.prototype.method); // "function"
И побеждает преимущество использования prototype
по мере воссоздания метода с каждым дополнительным экземпляром:
var method = a.method;
console.log(a.method === method); // true
var b = new Class();
console.log(a.method === method); // false
Ответ 2
this.prototype будет ссылаться на этот экземпляр объекта класса. Это не принесет вам большой пользы из-за объема.
Class.prototype добавляет функциональность классу, а не его экземпляр.
Ответ 3
Class
- функция; this
- это объект. Функции имеют свойство prototype
; объектов нет. Там свойство __proto__
, определенное на объектах, но этот интерфейс устарел. Вы можете сделать что-то вроде
function Class () {
var prototype = Object.getPrototypeOf(this);
prototype.method = function () {};
}
внутри вашего конструктора, но это не очень хорошая практика - каждый раз, когда Class
создается, будет бесполезно перезаписывать циклы method
на прототипе, а в случаях с более сложным кодом может закончиться также потерей памяти.
Короче говоря, у него нет верха и, возможно, серьезных минусов, чтобы сделать это таким образом.