--- title: Inicjalizator obiektu slug: Web/JavaScript/Reference/Operators/Object_initializer translation_of: Web/JavaScript/Reference/Operators/Object_initializer original_slug: Web/JavaScript/Referencje/Operatory/Object_initializer ---
Obiekty można tworzyć używając new Object(), Object.create(), bądź wykorzystując notację literałową (notację inicializacyjną). Inicjalizator obiektu to lista zera lub więcej par - nazw właściwości oraz ich wartości - otoczonych nawiasami klamrowymi ({}).
var o = {};
var o = { a: "foo", b: 42, c: {} };
var a = "foo", b = 42, c = {};
var o = { a: a, b: b, c: c };
var o =
{
wlasciwosc: function ([parametry]) {},
get wlasciwosc() {},
set wlasciwosc(wartosc) {},
};
Pamiętaj aby zapoznać się z tabelą kompatybilności. Środowiska nie obsługujące tych notacji będą wyrzucać błędy składni.
// Skrótowe nazwy właściwości (ES6)
var a = "foo", b = 42, c = {};
var o = { a, b, c };
// Skrótowe nazwy metod (ES6)
var o = {
wlasciwosc([parametry]) {},
get wlasciwosc() {},
set wlasciwosc(wartosc) {},
* generator() {}
};
// Obliczone nazwy właściwości (ES6)
var nazwa = "foo";
var o = {
[nazwa]: "dzien",
["b" + "ar"]: "dobry",
};
Inicjalizator obiektu to wyrażenie opisujące inicjalizację obiektu {{jsxref("Object")}}. Obiekty składają się z właściwości używanych do opisywania obiektu. Wartości tych właściwości mogą zawierać {{Glossary("primitive")}} typy danych albo inne obiekty.
Pusty obiekt możemy stworzyć w taki sposób:
var obiekt = {};
Jednak prawdziwą przewagą notacji literałowej jest możliwość tworzenia w szybki sposób obiektów ze zdefiniowanymi od razu właściwościami. Wystarczy wypisać listę kluczy: wartości odzdzielonych dwukropkiem. Poniższy przykład tworzy obiekt osoba z trzema właściwościami: "imie", "wiek" i "wyglad". Ich wartościami jest string "Adam", numer 42 oraz inny obiekt.
var osoba =
{
imie: "Adam",
wiek: 42,
wyglad: { wzrost: 179 },
}
Kiedy już stworzyłeś obiekt, możesz chcieć zobaczyć lub zmienić jego właściwości. Można zrobić to używając zapisu z kropką lub nawiasami. Zajrzyj do operatorów pamięci po więcej informacji.
object.imie; // "Adam" object["wiek"]; // 42 object.imie = "Ewa";
Nauczyliśmy się już jak zapisywać właściwości używając notacji literałowej. Czasami jednak mamy w kodzie zmienne, które chcielibyśmy dodać do naszego obiektu. Możemy to zrobić w taki sposób:
var a = "foo",
b = 42,
c = {};
var o =
{
a: a,
b: b,
c: c
};
Ale ECMAScript 2015 oddaje nam do dyspozycji krótszy zapis, pozwalający uzyskać ten sam efekt:
var a = "foo",
b = 42,
c = {};
// Skrótowe nazwy właściwości (ES6)
var o = { a, b, c };
W momencie, gdy użyjemy już istniejącej nazwy właściwości jej wartość nadpisze tę poprzednią.
var a = {x: 1, x: 2};
console.log(a); // { x: 2}
W ECMAScript 5 strict mode, duplikowanie nazw właściwości było postrzegane jako {{jsxref("SyntaxError")}}. Zmieniono to jednak po wprowadzeniu obliczanych nazw właściwości. Duplikacja stała się wówczas możliwa podczas wykonywania kodu, dlatego też w ECMAScript 2015 usunięto tę rystrykcję.
function czyES6UmozliwiaDuplikowanieWlasciwosci()
{
"use strict";
try
{
({ prop: 1, prop: 2 });
// Nie wyrzucono błędu, duplikacja dozwolona w strict mode.
return true;
}
catch (e)
{
// Wyrzucono błąd, duplikacja w strict mode zabroniona.
return false;
}
}
Właściwość obiektu może również odnosić się do funkcji albo metody getter lub setter.
var o = {
wlasciwos: function ([parametry]) {},
get wlasciwos() {},
set wlasciwos(wartosc) {},
};
w ECMAScript 2015, mamy dostęp do skróconego zapisu, takiego w którym słowo kluczowe "function" nie jest nam już potrzebne.
// Shorthand method names (ES6)
var o = {
property([parameters]) {},
get property() {},
set property(value) {},
* generator() {}
};
W ECMAScript 2015 możemy również w prostszy sposób zapisać właściwość będącą funkcją generatora:
var o = {
* generator() {
...........
}
};
W ECMAScript 5 musielibyśmy zapisać to tak (aczkolwiek pamiętaj że w ES5 nie ma generatorów):
var o = {
generator: function *() {
...........
}
};
Po więcej informacji zajrzyj do definicji metod.
Od ECMAScript 2015, składnia inicjalizatora obiektu wspiera także obliczone nazwy właściwości. Umożliwia to umieszczenie wyrażenia w nawiasach [], które potem zostanie przeliczone na nazwę właściwości. Działa to na tej samej zasadzie co zapis klamrowy w operatorach pamięci, z którymi zapewne miałeś już styczność. Teraz możemy użwać tej samej składni w notacji literałowej:
// Obliczone nazwy właściwości (ES6)
var i = 0;
var a = {
["foo" + ++i]: i,
["foo" + ++i]: i,
["foo" + ++i]: i
};
console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3
var param = 'typ';
var info = {
[param]: 'strona',
["pod" + param.charAt(0).toUpperCase() + param.slice(1)]: 'forum'
};
console.log(info); // { typ: 'strona', 'podTyp': 'forum' }
Definicja właściwości w formie __proto__: wartosc albo "__proto__": wartosc nie stworzy właściwości z nazwą __proto__. Zamiast tego, jeżeli podana wartość jest obiektem lub typem null, zamieni ona [[Prototype]] tworzonego obiektu na podaną wartość. (Jeżeli wartość nie jest ani obiektem ani typem null prototyp nie zostanie zmieniony.)
var obj1 = {};
console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true
var obj2 = { __proto__: null };
console.log(Object.getPrototypeOf(obj2) === null); // true
var protoObj = {};
var obj3 = { "__proto__": protoObj };
console.log(Object.getPrototypeOf(obj3) === protoObj); // true
var obj4 = { __proto__: "not an object or null" };
console.log(Object.getPrototypeOf(obj4) === Object.prototype); // true
console.log(!obj4.hasOwnProperty("__proto__")); // true
Podczas notacji literałowej możemy zmienić prototyp tylko raz, kolejne próby będą skutkować błędami składni.
Jeżeli użyjemy w defninicji nazwy __proto__ bez używania składni z dwukropkiem, nazwa ta będzie się zachowywać jak kazda inna.
var __proto__ = "wartosc";
var obj1 = { __proto__ };
console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true
console.log(obj1.hasOwnProperty("__proto__")); // true
console.log(obj1.__proto__ === "wartosc"); // true
var obj2 = { __proto__() { return "witaj"; } };
console.log(obj2.__proto__() === "witaj"); // true
var obj3 = { ["__prot" + "o__"]: 17 };
console.log(obj3.__proto__ === 17); // true
Notacja literałowa to nie to samo co JavaScript Object Notation (JSON). Pomimo, że wyglądają podobnie, są miedzy nimi poważne różnice:
"wlasnosc": wartosc. Nazwa własności musi być w cudzysłowie, a defnicja nie może być skrócona.true, false, null, lub inny obiekt JSON.| Specification | Status | Comment |
|---|---|---|
| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Początkowa definicja. |
| {{SpecName('ES5.1', '#sec-11.1.5', 'Object Initializer')}} | {{Spec2('ES5.1')}} | Dodano metody getter oraz setter. |
| {{SpecName('ES6', '#sec-object-initializer', 'Object Initializer')}} | {{Spec2('ES6')}} | Skrócone nazwy właściwości/metod oraz obliczone nazwy właściwości. |
| {{SpecName('ESDraft', '#sec-object-initializer', 'Object Initializer')}} | {{Spec2('ESDraft')}} |
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Basic support | {{CompatChrome(1.0)}} | {{CompatGeckoDesktop("1.0")}} | 1 | 1 | 1 |
| Computed property names | {{CompatVersionUnknown}} | {{CompatGeckoDesktop("34")}} | {{CompatNo}} | {{CompatNo}} | 7.1 |
| Shorthand property names | {{CompatVersionUnknown}} | {{CompatGeckoDesktop("33")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
| Shorthand method names | {{CompatChrome(42.0)}} | {{CompatGeckoDesktop("34")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
| Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|
| Basic support | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("1.0")}} | 1 | 1 | 1 | {{CompatChrome(1.0)}} |
| Computed property names | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("34")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
| Shorthand property names | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("33")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
| Shorthand method names | {{CompatNo}} | {{CompatChrome(42.0)}} | {{CompatGeckoMobile("34")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatChrome(42.0)}} |