создание открытого метода в функции конструктора: зачем использовать ключевое слово prototype? - PullRequest
2 голосов
/ 04 марта 2011

Если я создам конструктор функции BlahWidget и предоставлю ему 2 открытых метода: publicHello и secondHello.Я назначаю publicHello непосредственно внутри виджета, используя «this», но использую объект-прототип для назначения метода secondHello. Какая разница в поведении двух методов в виджете?

var BlahWidget = function(){
  this.publicHello = function(){
    alert("Hello");
  }
};

BlahWidget.prototype.secondHello = function(){
  alert("Second Hello");
}

Насколько я понимаю, использование .prototype позволяет вызывать его унаследованные объекты.Но оказывается, что это не так.Оба метода могут вызываться объектами унаследованных функций, как показано ниже:

var MiniBlah = function(){

  this.callSupers = function(){
     this.publicHello();    
     this.secondHello();
  }
}


MiniBlah.prototype = new BlahWidget();
MiniBlah.prototype.constructor = MiniBlah;

var x = new MiniBlah();
x.callSupers();//calls both publicHello and secondHello

Ответы [ 3 ]

6 голосов
/ 04 марта 2011

Разница в том, что функции, объявленные в объекте-прототипе, являются общими для экземпляров объектов, созданных функцией конструктора, тогда как функции, объявленные внутри тела функции-конструктора, не являются таковыми, они принадлежат объекту, созданному из функции.

На практике это означает, что вы можете создать загрузку объектов из функции конструктора с помощью функции на прототипе, выполняющей X, а затем изменить эту функцию на прототипе на Y, и все экземпляры объектов получат новую функциональность.функции.

Пример

var BlahWidget = function(){
  this.publicHello = function(){
    console.log("Hello");
  }
};

BlahWidget.prototype.secondHello = function(){
  console.log("Second Hello");
}

var blah1 = new BlahWidget();

var blah2 = new BlahWidget();
blah2.publicHello = function() {
    console.log("Goodbye");
}

blah1.secondHello(); // logs SecondHello
blah2.secondHello(); // logs SecondHello

BlahWidget.prototype.secondHello = function(){
  console.log("Second Goodbye");
}

blah1.secondHello(); // logs Second Goodbye
blah2.secondHello(); // logs Second Goodbye

blah1.publicHello(); // logs Hello
blah2.publicHello(); // logs Goodbye
1 голос
/ 04 марта 2011

Каждый экземпляр «BlahWidget» будет иметь свою собственную отдельную копию функции «publicHello».

Кроме того, хотя это просто академический, я не уверен, что скажу, что «прототип»является ключевым словом ;это больше похоже на «специальное имя свойства».

0 голосов
/ 09 августа 2016

В JavaScript функции настолько мощны, что позволяют создавать ООП и модульные концепции. Следующие концепции реализованы с использованием функции только в JavaScript:

  1. Метод
  2. Класс
  3. Конструктор
  4. Модуль

Ниже приведен код, который создает класс MyClass и имеет закрытые члены:

function MyClass(a) {  
    var count = 3; // private member  
  
    // this check function is private function  
    function check() {  
        if (count > 0) {  
            count--;  
            return true;                  
        }  
        else {  
            return false;  
        }  
    }  
    this._a = a;  
    this.get = function () {  
        if (check()) { // use of private function  
            return this._a;  
        }  
        else {  
            return "Thullu"; // after invoking get method 3 times in the object this else will be executed  
        }  
    }  
}  

В приведенной выше кодовой переменной count является закрытым, поскольку любой объект, созданный из MyClass, не будет иметь этой переменной, аналогично, функция check () является закрытой функцией, поскольку эта функция не является частью этого в MyClass. Когда мы создаем объект MyClass, используя ключевое слово new, это возвращается. Эта концепция возможна в JavaScript из-за лексической области видимости (функциональная область видимости).

Когда мы создаем объект этого класса MyClass и вызываем метод get более 3 раз: enter image description here

Я хотел бы написать несколько замечаний относительно нового ключевого слова.

Когда функция вызывается с оператором new, новый объект создается с членами-прототипами и присваивается этому. Вышеуказанное утверждение верно только в том случае, если в функции нет явного возвращаемого значения Если явное возвращение присутствует в классе (функции), то этому же назначению будет присвоен объект. Я хотел бы привести еще один пример с очень простой функциональностью, как во всех имеющихся у нас языках ООП. Мы объявляем приватное поле, а затем используем открытые свойства для предоставления приватного поля, более формальным способом и способом ООП, и создаем метод Get и Set для обновления приватного поля или извлечения приватного члена класса.

Та же функциональность get и set для приватных переменных в JavaScript, которую мы можем достичь, как показано в следующем примере:

// private class with get and set methods  
   function MyClass() {  
       var _privateField = 0; // It is private field as it is not part of "this"  
       this.GetPrivateField = function () {  
           return _privateField;  
       };  
       this.SetPrivateField = function (value) {  
           _privateField = value;  
       };  
   } 

enter image description here

...