2013-08-06 12 views
8

Jestem nowy dla obiektów w javascript. Przeczytaj na ten temat na https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript i trochę się mylisz.Definicja obiektu na 2 sposoby - jaka jest różnica?

Nie rozumiem różnicy między funkcjami a obiektami. Z jednej strony funkcja ma być i instancją funkcji (która jest dzieckiem obiektu), a więc funkcja ma być również Obiektem.

Z drugiej strony sam obiekt jest oznaczony jako parę klucz-wartość, takich jak:

  1. var User = {name:"Tomy", password:"secret"}

    i to jest całkiem inna od definicji funkcji w zakresie kompatybilności kodu ..

    Czy mogę utworzyć funkcję na dwa różne sposoby?

  2. var User = function() {this.name="Tomy"; this.password="secret";}

+2

Z B u można zrobić 'var Tomy = new User();' – DarkBee

+2

i przedmiot to struktura danych przechowująca ... dane. Funkcja jest zbiorem poleceń wielokrotnego użytku. Możesz użyć funkcji jako * funkcja konstruktora *, aby * stworzyć * obiekt. Literał obiektowy i funkcja konstruktora to dwa sposoby tworzenia obiektów, tyle tylko, że musisz jawnie * wywołać * funkcję konstruktora, aby utworzyć obiekt. –

+0

@DarkBee Dokładniej, wersja B ma prototyp (zestaw właściwości sklonowanych na każdej nowej instancji), podczas gdy A nie. EDYCJA: Sprawia, że ​​myślę, czy możesz użyć nowego z A, jeśli dodasz prototypową właściwość do anonimowego obiektu? – Virus721

Odpowiedz

7

W tym przykładzie obiekt User jest teraz przechowywany.

var User = {name:"Tomy", password:"secret"} 
typeof User === "object" 
User.name === "Tomy" 

W tym przykładzie User będzie posiadał funkcję. Ta funkcja może być używana do tworzenia obiektów.

var User = function() {this.name="Tomy"; this.password="secret";} 
typeof User === "function" 
User.name === undefined 

Następnie można utworzyć dowolną liczbę użytkowników.

var user1 = new User(), user2 = new User(); 
user1.name === "Tomy" 

bardziej realistyczny przykład byłoby to:

var User = function (name, pass) {this.name=name; this.password=pass;} 

var john = new User("John", "secret") 
var andrew = new User("Andrew", "passw0rd") 

john.password === "secret" 

ogół konstruktorzy (funkcje, które czynią obiekty) są bardziej elastyczne niż literałach przedmiotu, oraz pozwala na wygodny i konsekwentne tworzenie obiektów (błędy są łatwiejsze do wykrycia, mniej duplikatu kodu).

W obu metodach nie ma niespójności między przeglądarkami.


Aby zrozumieć, co new keyword jest i co faktycznie dzieje się w "momencie stworzenia", patrz What is the 'new' keyword in JavaScript? i How does the new operator work in JavaScript?

+0

ok, ostatnie pytanie dotyczące "momentu stworzenia" obiektu ;-). kiedy robię var john = new User ("John", "secret"), co dokładnie się dzieje? Domyślam się, że: 1) tworzony jest nowy obiekt. 2) jest to związane z tym nowo utworzonym obiektem. 3) wywoływana jest funkcja. (i tak tworzy członków danych podczas wywoływania this.something). Czy dobrze to rozumiem? – Novellizator

+0

@Novellizator, dodałem wyjaśnienie na końcu mojej odpowiedzi. – FakeRainBrigand

+0

@FakeRainBrigand: Nie, nic nie jest kopiowane. A nowy obiekt nie jest równoważny '{}' (chyba że 'User.prototype' ma wartość' null'). Informacje na temat prawidłowych kroków można znaleźć na stronie https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new. – Bergi

2

Pierwszy tworzy egzemplarz obiektu z dwóch właściwości. Można do nich tak:

User.name; // Tomy 
User.password; // secret 

Drugi tworzy definicję obiektu, który można utworzyć oddzielne instancje i będą mieć osobne instancje ich właściwości. Przykład:

var a = new User(); 
a.name; // Tomy 
a.password; // secret 
var b = new User(); 
b.name = "Ralph"; 
a.name; // Tomy 
b.name; // Ralph 
1

Te dwa elementy nie są zdalnie równoważne. Pierwsza wersja tworzy obiekt o zestawach właściwości name i password. Druga wersja tworzy funkcję, która nie została wykonana; nie ma właściwości ustawionych do czasu wywołania new User.

Powiązane problemy