2010-06-18 2 views
5

Я изучаю JavaScript, и я не могу понять, почему вы должны использовать методы, которые не являются «привилегированными», то есть не определены в конструкторе, а скорее прототипом класса.Зачем делать непривилегированные методы?

Я понимаю идею инкапсуляции и все, но вы никогда не инкапсулируете части класса из остальной части его в большую часть мира OO.

ответ

18

Когда функция определена в конструкторе, каждый раз, когда вызывается конструктор, создается новый экземпляр этой функции. Он также имеет доступ к частным переменным.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 

    // privileged function (created each time) 
    this.sayHello = function() { 
     return 'Hello my name is ' + this.name; 
     // function also has access to mySecret variable 
    }; 
} 

Когда функция определена на прототипе, то функция создается только один раз и один экземпляр этой функции является общим.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 
} 

// public function (created once) 
myClass.prototype.sayHello = function() { 
    return 'Hello my name is ' + this.name; 
    // function has NO access to mySecret variable 
}; 

Таким образом, определение функции на прототипе создает меньше объектов, которые могут дать лучшую производительность. С другой стороны, общедоступные методы не имеют доступа к частным переменным. Дальнейшие примеры и аргументы можно найти здесь: http://www.crockford.com/javascript/private.html

+0

@aharon: На всякий случай: будьте осторожны при использовании ['this'] (http://blog.niftysnippets.org/2008/04/you-must-remember -this.html). –

+0

Я обновил свой ответ, чтобы сделать более понятным разницу между публичной, частной и привилегированной. – Greg

Смежные вопросы