2013-07-05 16 views
11

Uruchomiłem programowanie przez Internet tylko przez 13 dni na Codeacademy.com i uważam, że jest to dobre miejsce do nauki. Ale wciąż nie rozumiem źle rzeczy. Zawsze sprawdzam je na w3school.com, ale tym razem nie mogłem znaleźć potrzebnych informacji. Tak więc, jak się dowiedziałem, istnieją dwa typy tworzenia obiektów: zapis literalny obiektu i drugi: Konstruktor obiektu. Nauczyłem się, że istnieją również metody i funkcje, ale nie mogłem zrozumieć, jak stworzyć metodę w notacji literalnej obiektu? W konstruktorze obiektów po prostu piszę: "jak stworzyć metodę w notacji literalnej obiektu?

var bob = new Object(); 
bob.age = 30; 
bob.setAge = function (newAge) 
{ 
bob.age = newAge; 
}; 

Czy możesz mi powiedzieć, jak zrobić to samo, pisząc literalną notację obiektową.

var bob = { 
age: 30 
}; 
+4

Proszę zapomnieć o w3schools. To okropny zasób. Zamiast tego użyj MDN. A zamiast 'new Object()', lepiej po prostu użyć '{}'. – kapa

+0

Jeśli chcesz korzystać z funkcji w instancjach obiektu (takich jak tworzenie obiektów kilkuosobowych), zdefiniowanie tej samej funkcji dla każdego obiektu nie jest efektywne. W JavaScript można używać funkcji konstruktora i ustawiać właściwości wspólne (takie jak funkcje) na jego prototypie: http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR

+0

Mój kod nadal nie działa , czy powinienem napisać to tutaj, czy utworzyć nowe pytanie? Jestem nowy w stackoverflow :) – Vato

Odpowiedz

28

Składniowo, zmiana jest bardzo prosta:

var bob = { 
    age: 30, 
    setAge: function (newAge) { 
    bob.age = newAge; 
    } 
}; 

Ale jak widać, nie jest to problem: jak w kodzie używa zmiennej zewnętrznej bob tak to nie będzie działać, jeśli zmień wartość zmiennej bob.

można naprawić z

var bob = { 
    age: 30, 
    setAge: function (newAge) { 
    this.age = newAge; 
    } 
}; 

Należy pamiętać, że w tym momencie należy sprawdzić, czy to, czego potrzebujesz to nie w rzeczywistości, a class, które mogłyby przynieść poprawę wydajności, jeśli masz kilka wystąpień.

Aktualizacja: ECMAScript 6 pozwala obecnie metody, które zostaną określone w ten sam sposób niezależnie od tego, czy są one w obiekcie dosłownym:

var bob = { 
    age: 30, 
    setAge (newAge) { 
    this.age = newAge; 
    } 
}; 
+0

dziękuję Spróbuję :) – Vato

+0

Myślę, że pytanie dotyczyło tylko tego, jak uzyskać ten sam rezultat, co w pierwszym fragmencie :-) Czy używać "tego" lub zmiennej jest omawiane [tutaj] (http: // stackoverflow.com/q/10711064) już – Bergi

+0

Mój kod nadal nie działa, czy powinienem zapisać go tutaj, czy utworzyć nowe pytanie? (Jestem nowy w stackoverflow) :) – Vato

3

Jej nic inny i tak proste, jak

var bob = { 
    age:  30, 
    setAge: function(newAge) { 
     this.age = newAge; 
    } 
}; 

Alternatywnie można utworzyć realną funkcję ustawiającą albo poprzez wywołanie Object.defineProperty() lub tak proste, jak

var bob = { 
    age:  30, 
    firstName: 'j', 
    lastName: 'Andy', 
    set setName(newName) { 
     var spl = newName.split(/\s+/); 
     this.firstName = spl[ 0 ]; 
     this.lastName = spl[ 1 ]; 
    } 
} 

Gdzie można iść jak

bob.setName = "Thomas Cook"; // which sets firstName to "Thomas" and lastName to "Cook" 
+0

dziękuję, ja będę kontynuował moją podróż :) – Vato

+2

Nie nazwałbyś własności setera 'setX' :-) – Bergi

+0

@Bergi Wiedziałem, że ktoś narzeka: p – jAndy

0

tak:

var bob = { 
    age: 30, 
    setAge: function (age) { 
     this.age = age; 
    } 
} 
alert(bob.age); // 30 
bob.setAge(45); // set age = 45 
alert(bob.age); // 45 
1

Ostatni kod, który pisał brakuje przecinka. Ponadto nie potrzebujesz ";" po definicji funkcji właściwości obiektu. Tak:

var object2 = { 
name: "Fred", 
age: 28, 
club: "Fluminense", 
bio2: function(){ 
    console.log(this.name +" is "+ this.age + " years old and he is playing in "+    this.club); 
    } 
}; 
+0

Zostało to przeniesione do innego pytania: http://stackoverflow.com/questions/17487840/whats-wrong-with-my-code-in-creating-a-method-in-object-literal-notation – Bergi

1

Jest to sposób na rozwiązanie tego zadania za pomocą dosłownego metodę tworzenia obiektu:

var setAge = function (newAge) { 
    this.age = newAge; 
}; 

var bob = new Object(); 
bob.age = 30; 
bob.setAge = setAge; 

var susan = { 
    age: 25, 
    setAge: setAge 
} 

susan.setAge(35); 
0

Jeśli chcesz enkapsulacji, można użyć następującej składni (funkcja self-wykonanie). Tutaj wiek nie jest dostępny z zewnątrz obiektu.

var bob = (function() { 
    //...private 
    var age = 30; 

    function setAge(newAge) { 
     age = newAge; 
    }; 

    function getAge() { 
      return age; 
     } 
    // Public api 
    return { 
     setAge: setAge, 
     getAge: getAge 
    } 
}()); 
bob.setAge(50); 
alert(bob.getAge()); 

jsfiddle: http://jsfiddle.net/61o9k98h/1/

Powiązane problemy