Учитывая ваши первые два примера, предполагая, что вы вызываете p()
в качестве конструктора:
- на поверхности , они будут вести себя одинаково
Но первый пример ...
- создаст новую идентичную функцию для каждого объекта, созданного из
new p()
- [эта функция] будет иметь доступ к локальным переменным и параметрам внутри конструктора
p()
// p.prototype = {}
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^
и второй пример ...
- поделит функцию, помещенную в прототип, между всеми объектами, созданными из
new p()
- [эта функция] не будет иметь доступа к закрытым переменным / параметрам в конструкторе
//p.prototype = {do:function(){alert('cool')};}
new p(); // {} ------^
new p(); // {} ------^
new p(); // {} ------^
Третий пример не работает, потому что в JavaScript функция - это объект, поэтому все, что вы делаете, это помещает новое свойство в этот объект. Это не влияет на вызов этой функции.