2009-02-02 12 views

Odpowiedz

48
var newObj = { 
    met1 : function() { 
     alert('hello'); 
    } 
}; 

Następnie, sposób może być nazywany jak np:

newObj.met1(); 

okazji, w przypadku podania nowego obiektu, należy przedmiot dosłownego ({}) nie konstruktora new Object().

+4

"podczas deklarowania nowego obiektu należy użyć literału obiektowego (' {} '), a nie konstruktora' new Object() '. - Dlaczego tak jest? –

+6

@ PaulD.Waite: Uważam, że nie ma logicznej różnicy, ale literały obiektów są bardziej zwarte, pozwalają na ustawienie właściwości w tym samym słowie i są na ogół bardziej akceptowanym sposobem na to (http://stackoverflow.com/q/ 4597926/1175459). – Sean

+0

@Sean: gotcha, okrzyki. –

13

Ogólnie użyć właściwości prototype:

function YourObject() 
{ 
    // 
} 

YourObject.prototype.yourMethod= function() 
{ 
    // 
} 

Jedno nie widziałem jeszcze ktoś wspomnieć, dlaczego warto skorzystać z właściwości prototype ciągu, powiedzmy, notacja obiektowo dosłowny: robić to gwarantuje Definicja funkcji jest udostępniana we wszystkich instancjach obiektów utworzonych na podstawie prototypu funkcji, a nie raz na instancję.

+0

Uh, nie, właściwie to nie działa. Możesz dodać metody do obiektu, dodając je do prototypowej właściwości funkcji, a następnie tworząc ją, ale nie modyfikując właściwości o nazwie "prototyp" na instancji. – Shog9

+2

Przepraszam, że o to mi chodziło, tak; Od samego rana koduję ActionScript. :) Poprawię. Hej i dzięki temu, kto mnie zawiódł; doceniać to. –

+0

Jeez, idźcie łatwi ludzie - koncepcja jest absolutnie poprawna. –

83

Z odpowiedzi wynika, że ​​masz już więcej niż jeden sposób.

#1 
var o = new Object(); 
o.method = function(){} 

#2 
var o = new Object(); 
o.prototype.method = function(){} 

#3 
function myObject() { 
    this.method = function(){} 
} 
var o = new myObject(); 

#4 
function myObject() {} 
myObject.prototype.method = function(){} 
var o = new myObject(); 

#5 
var o = { 
    method: function(){} 
} 

# 3 i # 4 używają funkcji konstruktora. oznacza to, że można ich użyć do utworzenia wielu obiektów tej samej "klasy" (klasy w rzeczywistości nie istnieją w JavaScript).

# 4 różni się od # 3, ponieważ wszystkie obiekty skonstruowane z # 4 będą miały identyczny Metoda "metoda", ponieważ jest własnością ich prototypu. Oszczędza to pamięć (ale tylko bardzo małą ilość) i jeśli zmienisz metodę prototypu, wszystkie obiekty # 4 zostaną natychmiast zaktualizowane - nawet jeśli zostały już utworzone.

# 1, # 2 i # 5 są w zasadzie równoważne. Jest tak dlatego, że prawdopodobnie będzie tylko jeden z nich na raz, więc fakt, że # 2 ma metodę dodaną do prototypu, nie ma znaczenia. (Nie biorąc pod uwagę klonowania)

Istnieje jeszcze więcej sposobów dodawania metod do obiektów korzystających z zamknięciem fabryki lub dodanie „statycznym” Właściwości/metod do funkcji lub prywatnych funkcji zagnieżdżonych ... :)

+0

Jak zdefiniować metodę (na przykład 'hasClass') dla każdego elementu HTML? –

+2

# 2 nie działa. Usuń go z odpowiedzi za pomocą 72 woluminów :-) – Bergi

1

Function.prototype.implement = function(member, value) { 
    this[member] = value; 
    return this; 
} 

function MyFunction() { 
//... 
} 

(function($){ 

$.implement("a", "blabla") 
.implement("b", function(){ /* some function */ }) 
.implement("c" {a:'', b:''}); 

})(MyFunction); 
2

nie martw się bracie, tu jest kod:

var myObj=function(){ 
     var value=null 

    this.setValue=function(strValue){ 

    this.value=strValue; 
    }; 

    this.getValue=function(){ 
    return this.value; 
    };  
}; 

można nazwać ten obiekt tak:

var obj= new myObj(); 
    obj.setValue("Hi!"); 
    alert(obj.getValue()); 
0

Możesz również wykonać następujące czynności zamiast korzystać z metody "Object.create()".

Wywołanie funkcji: definicja

com.blah.MyChildObj.prototype = createObject(com.blah.MyParentObj.prototype, 
    com.blah.MyChildObj); 

Funkcja:

function createObject(theProto, theConst) { 
    function x() {}; 
    x.prototype = theProto; 
    x.prototype.constructor = theConst; 
    return new x(); 
} 
1

Z es6 można zrobić to tak:

var a = { 
 
    func(){ 
 
     return 'The value'; 
 
    } 
 
} 
 
    
 
document.getElementById('out').innerHTML = a.func(); 
 
<div id="out"></div>

+1

Powinieneś wspomnieć, że to nie jest ES5 i nie będzie działać wszędzie. – Bergi

+0

Zobacz [Jak działa ta metoda modułu bez słowa kluczowego "funkcja"?] (Http://stackoverflow.com/q/32404617/1048572) – Bergi

+0

Tak, znalazłem już – msangel

Powiązane problemy