Metody obiektu w JavaScript ES5

ECMAScript 5 (2009) dodał wiele nowych metod obiektów do JavaScript.

Zarządzanie obiektem

// Tworzy obiekt z istniejącym obiektem jako prototypem
Object.create()
// Dodaje lub zmienia atrybuty obiektu
Object.defineProperty(object, property, descriptor)
// Dodaje lub zmienia atrybuty obiektu
Object.defineProperties(object, descriptors)
// Dostęp do atrybutu
Object.getOwnPropertyDescriptor(object, property)
// Zwraca tablicę wszystkich atrybutów
Object.getOwnPropertyNames(object)
// Dostęp do prototypu
Object.getPrototypeOf(object)
// Zwraca tablicę wyciągniętych wyczytywalnych atrybutów
Object.keys(object)

Ochrona obiektu

// Zapobiega dodawaniu atrybutów do obiektu
Object.preventExtensions(object)
// Zwraca true, jeśli atrybuty można dodać do obiektu
Object.isExtensible(object)
// Zapobiega modyfikacji atrybutów obiektu (nie wartości)
Object.seal(object)
// Zwraca true, jeśli obiekt jest zamknięty
Object.isSealed(object)
// Zapobiega jakimkolwiek zmianom w obiekcie
Object.freeze(object)
// Zwraca true, jeśli obiekt jest zamarznięty
Object.isFrozen(object)

Zmiana wartości atrybutu

语法

Object.defineProperty(object, property, {value : value)

instancja

W tym przykładzie zmieniamy wartość atrybutu:

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Modyfikacja atrybutu
Object.defineProperty(person, "language", {value : "NO"});

Spróbuj sam

Zmiana metadanych

ES5 pozwala na zmianę następujących metadanych atrybutów:

writable : true      // Wartość atrybutu może być zmieniona
enumerable : true    // Atrybut można liczyć
configurable : true  // Atrybut można ponownie skonfigurować
writable : false     // Wartość atrybutu nie może być zmieniona
enumerable : false   // Atrybut nie jest liczony
configurable : false // Atrybut nie może być ponownie skonfigurowany

ES5 pozwala na zmianę getterów i setterów:

// Definicja gettera
get: function() { return language }
// Definicja settera
set: function(value) { language = value }

Ten przykład ustawia language jako tylko do odczytu:

Object.defineProperty(person, "language", {writable:false});

Ten przykład uczyni language niewypisalnym:

Object.defineProperty(person, "language", {enumerable:false});

Wyświetlanie wszystkich atrybutów

Ten przykład wyświetla wszystkie atrybuty obiektu:

instancja

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
Object.defineProperty(person, "language", {enumerable:false});
Object.getOwnPropertyNames(person);  // Zwraca tablicę tablic

Spróbuj sam

Wyświetlanie wypisanych atrybutów

Ten przykład wyświetla tylko wypisane atrybuty obiektu:

instancja

const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
Object.defineProperty(person, "language", {enumerable:false});
Object.keys(person);  // Zwraca tablicę wypisanych atrybutów

Spróbuj sam

Dodawanie atrybutu

Ten przykład dodaje nowy atrybut do obiektu:

instancja

// Tworzenie obiektu
const person = {
  firstName: "Bill",
  lastName : "Gates",
  language : "EN"
};
// Dodawanie atrybutu
Object.defineProperty(person, "year", {value:"2008"});

Spróbuj sam

Dodawanie Getterów i Setterów

Object.defineProperty() Metoda może również być używana do dodawania Getterów i Setterów:

instancja

// Tworzenie obiektu
const person = {firstName:"Bill", lastName:"Gates"};
// Definicja gettera
Object.defineProperty(person, "fullName", {
  get: function () {return this.firstName + " " + this.lastName;}
});

Spróbuj sam

przykład instancji licznika

// Definicja obiektu
const obj = {counter:0};
// Definicja settera
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (i) {this.counter -= i;}
});
// Operacja licznika:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;

Spróbuj sam