2012-02-26 4 views
5

Насколько я могу судить, существуют два основных способа создания функций для объекта в javascript. К ним относятся:Создание функций для объекта в javascript

Метод А, сделать это в конструкторе:

function MyObject() { 
    this.myFunc1 = function() { 
     ... 
    } 
    this.myFunc2 = function() { 
     ... 
    } 
    ... 
} 

Метод B, добавьте его к прототипу:

function MyObject() { 
    ... 
} 

MyObject.prototype.myFunc1 = function() { 
    ... 
} 

MyObject.prototype.myFunc2 = function() { 
    .... 
} 

Очевидно, что если вы сделали:

MyObject.myFunc3 = function() { 
    .... 
} 

, то myFunc3 будет ассоциироваться с MyObject самостоятельно, а не с любыми новыми объектами, созданными с помощьюКлючевое слово. Для ясности мы будем называть его методом C, хотя он не работает для создания новых объектов с ключевым словом new.

Итак, я хотел бы знать, каковы различия между ними. Насколько я могу судить, они имеют такой же эффект логически, даже если то, что происходит на машине, отличается.

Если бы я предполагал, что я бы сказал, что единственное реальное различие заключается в том, что вы определяете их в конструкторе, как в методе A, он создает целый новый функциональный объект для каждого созданного объекта, а метод B поддерживает только один экземпляр его (в MyObject), который он ссылается на любое время его вызова. если это так, почему бы вам сделать это один за другим. В противном случае, какая разница между методом A и методом B.

+0

Вы также можете создавать функции в таких объектах, как [это] (http://jsfiddle.net/uwv5a/) –

+0

читать о шаблоне модуля: http://www.engfers.com/code/javascript-module-pattern/ – bryanmac

+0

@CoreyFarwell, я бы предположил, что это в основном то же, что и метод A, да? –

ответ

4

Преимущество предоставления отдельной функции каждому объекту заключается в том, что вы можете закрыть переменные в конструкторе, по сути, используя «частные данные».

function MyObject(a,b) { 
    var n = a + b; //private variable 
    this.myFunc1 = function() { 
     console.log(n); 
    } 
}; 

против

function MyObject(a,b) { 
    this.n = a + b; //public variable 
} 

MyObject.prototype.myFunc1 = function() { 
    console.log(this.n); 
} 

ли это хорошая идея или нет, зависит от того, кто вы спрашиваете. Моя личная позиция резервирует функции конструктора, когда я фактически использую прототип, как в варианте № 2, и используя простые функции (например, make_my_object(a,b)) при использовании замыканий, как в варианте №1.

2

Идея состоит в том, что вы можете изменить прототип в любое время, и все объекты типа (даже созданные до модификации) наследуют изменения. Это связано с тем, что, как вы упомянули, прототип не копируется с каждым новым экземпляром.

0

MyObject в способе A представляет собой пример для внутренних функций. Вы не можете явно вызывать его функции вне его, если не был создан объект (вы можете назвать его классом).

Предположим, что это:

MyObject.MyFunc1(); // will not work 
var obj = new MyObject(); 
obj.MyFunc1(); // will work 

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

также заметить:

function MyObject() { 
     var privateVar = "foo"; 

     this.publicProperty = "bar"; 

     // public function 
     this.publicFunc = function() { 
      ... 
     } 

     // private function 
     function privateFunc() { 
      ... 
     } 
    } 

Для метода B это так же, как с помощью метода А, единственным отличием является прототипирование стиль создания объекта. Некоторые используют прототипы для удобочитаемости или предпочтения. Главным преимуществом прототипов является то, что вы можете расширить существующий объект, не касаясь исходного источника. Вы должны быть осторожны с этим. (в качестве примера рамок прототипа)

Для метода C вы можете назвать их статическими функциями. Как вы сказали, что они могут быть вызваны явно ссылкой через объект, как:

MyObject.MyFunc1(); 

Так какой из них использовать, зависит от вас обработки ситуации.

+0

В методе B методы также являются методами экземпляра. Вы путались с его гипотетическим и немеченым «методом С»? – hugomg

+0

@ missingno Я вижу, что вы на самом деле. Я явно обозначил его как метод c, хотя он действительно не работает для создания новых объектов с ключевым словом 'new'. –

+0

@ missingno да, извините. Как-то прототипы проскользнули у меня на глазах. Правильный ответ –

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