#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 не будет, а во втором - будет.)
Комментариев нет:
Отправить комментарий