Подтвердить что ты не робот

Класс .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?
  • Как насчет наследования?
4b9b3361

Ответ 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 на прототипе, а в случаях с более сложным кодом может закончиться также потерей памяти.

Короче говоря, у него нет верха и, возможно, серьезных минусов, чтобы сделать это таким образом.