2012-02-26 22 views
5

O ile wiem, istnieją dwa główne sposoby tworzenia funkcji dla obiektu w javascript. Są to:Tworzenie funkcji dla obiektu w javascript

Metoda A, aby go w konstruktorze:

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

metoda B, dodaj go do prototypu:

function MyObject() { 
    ... 
} 

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

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

Oczywiście jeśli nie:

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

, a następnie myFunc3 zostanie skojarzony z samym obiektem MyObject, a nie z żadnymi nowymi obiektami utworzonymi za pomocą new słowo kluczowe. Dla jasności nazwiemy to metodą C, mimo że nie działa ona przy tworzeniu nowych obiektów za pomocą słowa kluczowego new.

Chciałbym więc poznać różnice między nimi. O ile wiem, mają one ten sam efekt logicznie, nawet jeśli to, co dzieje się na maszynie, jest inne.

Jeśli miałbym zgadywać, powiedziałbym, że jedyną różnicą jest to, że definiując je w konstruktorze, jak w metodzie A, tworzy on zupełnie nowy obiekt funkcji dla każdego tworzonego obiektu, a metoda B zachowuje tylko jeden egzemplarz (w MyObject), że odnosi się do każdej chwili, kiedy zostanie wywołany. jeśli tak, dlaczego zrobiłbyś to w jedną stronę z drugiej strony? W przeciwnym razie, jaka jest różnica między metodą A i metodą B.

+0

Możesz również tworzyć funkcje w obiektach takich jak [to] (http://jsfiddle.net/uwv5a/) –

+0

przeczytaj o wzorze modułu: http://www.engfers.com/code/javascript-module-pattern/ – bryanmac

+0

@CoreyFarwell, przypuszczam, że to w zasadzie to samo co metoda A, tak? –

Odpowiedz

4

Zaletą nadania oddzielnej funkcji każdemu obiektowi jest możliwość zamknięcia zmiennych w konstruktorze, zasadniczo zezwalając na "prywatne dane".

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

vs

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

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

czy to jest dobry pomysł, czy nie, zależy od tego, kogo zapytasz. Moja osobista postawa rezerwuje funkcje konstruktorów, kiedy faktycznie używam prototypu, jak w opcji # 2 i używając prostych funkcji (powiedzmy make_my_object(a,b)) podczas używania zamknięć, jak w opcji # 1.

2

Chodzi o to, że można zmodyfikować prototyp w dowolnym momencie, a wszystkie obiekty tego typu (nawet te utworzone przed modyfikacją) odziedziczą zmiany. Dzieje się tak, ponieważ, jak wspomniałeś, prototyp nie jest kopiowany z każdą nową instancją.

0

MyObject w metodzie A to instancja dla funkcji wewnętrznych. Nie można wywoływać jego funkcji jawnie poza nim, chyba że obiekt (można go nazwać klasą) został utworzony.

Przyjmijmy to:

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

więc to jest takie samo jak każdej klasy w innych językach. Opisywanie użyteczności zajęć i ich zastosowań wykracza jednak poza to pytanie.

również zauważyć:

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

     this.publicProperty = "bar"; 

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

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

Dla metody B to samo jak z metodą A, jedyną różnicą jest prototypowanie jest styl tworzenia obiektu. Niektórzy używają prototypów dla czytelności lub nietypowych. Główną zaletą prototypów jest możliwość rozszerzenia istniejącego obiektu bez dotykania oryginalnego źródła. Musisz jednak zachować ostrożność. (jako przykład szkielet prototypowy)

Dla metoda C można nazwać je funkcjami statycznymi. Jak pan powiedział, że można je nazwać wyraźnie odwołując przez przedmiot jak:

MyObject.MyFunc1(); 

tak, to które z nich korzystać zależy od sytuacji jesteś obsługi.

+0

W metodzie B metody są również metodami instancji. Czy myliłeś się z jego hipotetyczną i nieoznaczoną "metodą C"? – hugomg

+0

@missingno Widzę, że masz rację. Wyraźnie określiłem to jako metodę c, nawet jeśli nie działa to w przypadku tworzenia nowych obiektów za pomocą słowa kluczowego "new". –

+0

@missingno tak, przepraszam. W jakiś sposób prototypowanie spadło mi przed oczami. Poprawiona odpowiedź –

Powiązane problemy