2015-08-02 2 views
0

В настоящее время я запутался в функции function.prototype. Я видел этот тип кода:Вызов функции, добавленной в прототип функции

define([], function() { 
    function HomeViewModel(route) { 
     this.message = ko.observable('Welcome to Home!'); 
     } 

     HomeViewModel.prototype.doSomething = function() { 
      this.message('You invoked doSomething() on the viewmodel.'); 
     }; 

     return HomeViewModel; 
    } 
} 

Как мы можем добавить функцию в прототип функции? Я также немного читал здесь: Function.protoype. В части описания указано, что:

Функциональные объекты наследуются от Function.prototype. Функция .prototype не может быть изменена.

Но приведенный выше код выглядит так, как будто он добавляет функцию в прототип функции. Я протестировал и код выше возвращает функция HomeViewModel(). Итак, как вы вызываете HomeViewModel.prototype.doSomething из возвращаемого значения или вне фактической функции?

+0

Пожалуйста, удалите ошибки синтаксиса в коде, на который у вас есть вопрос. Кроме того, я уверен, что у вас есть фигурные скобки в неправильном месте. – Tomalak

ответ

3

Разница в капитализации между функции и Function: в Javascript, вы можете абсолютно добавить методы Прототип функции, вы просто не можете добавлять методы к Function.prototype - Function является „базовый класс“ с именем Функция, где живут многие встроенные методы, которыми обладают все функции.

Если добавить метод к объектам прототипа, вы называете это так же, как вы могли бы назвать метод, который вы добавили в конструктор:

function Test() { 
    this.myMethod = function() { 
    return true; 
    } 
} 

t = new Test(); 
t.myMethod(); 

С методом добавляемые к прототипу:

function Test() { 
} 

Test.prototype.myMethod = function() { 
    return true; 
} 

t = new Test(); 
t.myMethod(); 

Так где же разница? Если добавить метод в конструкторе, каждый объект, созданный из этого конструктора получает свою собственную уникальную копию этого метода:

function Test() { 
    this.myMethod = ko.observable(); 
} 

a = new Test(); 
b = new Test(); 
a.myMethod('foo'); 
b.myMethod(); // returns undefined 

С другой стороны, методы добавление к прототипу являются совместно между всеми объектами, созданными от этого конструктора:

function Test() { 
} 

Test.prototype.myMethod = ko.observable(); 

a = new Test(); 
b = new Test(); 
a.myMethod('foo'); 
b.myMethod(); // returns 'foo' 
+0

Спасибо, что прояснил это. –

+0

информативный. Спасибо –

+0

Вы * можете * добавлять методы к прототипу функции, хотя это редко будет хорошей идеей. –

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