Javascript и прототип наследования - PullRequest
3 голосов
/ 21 августа 2011

Есть ли разница между этими двумя утверждениями в Javascript?

function p() {
    this.do = function(){alert('cool')};
}

и этим?:

function p(){};

p.prototype.do = function(){alert('cool')};

Еще одна вещь, почему вы не можете сделать:

function p(){};

p.do = function(){alert('cool')};

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Учитывая ваши первые два примера, предполагая, что вы вызываете 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 функция - это объект, поэтому все, что вы делаете, это помещает новое свойство в этот объект. Это не влияет на вызов этой функции.

0 голосов
/ 21 августа 2011

Функционально они одинаковы.

Первый определяет функцию для каждого объекта var o = new p(), поэтому она не оптимальна с точки зрения памяти.

Вы можете делайте то, что вы показываете в третьем примере, но вы не достигнете того, что думаете:

function p(){};

p.do = function(){alert('cool')};

p.do(); // this will work

var o = new p(); // This won't have the 'do' function because that's not how it works in javascript.
...