Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Чем отличается код javascript?

#prototype #javascript


Объясните пожалуйста, кто знает, чем отличается этот код:
function Button() {
  this.cc = 0;
  this.clicked = function() {
    this.cc+=1;
    console.log('Clicked ' + this.cc);
  }
}

От вот этого:
 function Button() {
      this.cc = 0;
    }
    Button.prototype.clicked = function() {
      this.cc+=1;
      console.log('Clicked ' + this.cc);
    }
    


Ответы

Ответ 1



Внешне - ничем не отличает. Но внутренне, для случая: function Button() { this.cc = 0; this.clicked = function() { cc+=1; console.log('Clicked ' + this.cc); } } (new Button()).clicked != (new Button()).clicked И это реально разные ( почти всегда полностью ) функции, с разным контекстом исполнения, и т.д и т.п... P.S: В принципи, это можно назвать private свойствами: function Button(){ var obj_private = {}, obj_fn = [], obj = this; for( var fn in this ){ if ( typeof this[ fn ] === 'function' ){ obj_fn.push( this[ fn ] ); } } this.get_private = function (){ if ( ( this == obj ) && ( obj_fn.indexOf( arguments.caller.callee ) != -1 ) ){ return private_obj; } } } Button.prototype.clicked = function (){ var pr = this.get_private(); pr[ cc ]++; console.log( 'Clicked' + pr[ cc ] ); }

Ответ 2



Первое - создание одного объекта, инициализация у него свойства и добавление к нему одного метода. Второе - создание одного объекта, инициализация у него свойства и добавление метода к прототипу, то есть ко всем объектам этого типа. (То есть разница в том, что у других объектов этого типа в первом случае нового метода clicked не будет, а во втором - будет.)

Комментариев нет:

Отправить комментарий