JS 1.8.5: Object.*

Nowe sposoby na obiekty
w JavaScripcie 1.8.5 i ECMAScripcie 5

I kto to mówi?

Dla przypomnienia: typowy obiekt JS


var anObject = {
  prop1: value1,
  prop2: value2,
  // ...
  propN: valueN
};

Dla przypomnienia: łańcuch prototypów


Object.prototype
  ...
    someOtherProto
      someProto
         ...
           anObject    

Między Object.prototype a naszym anObject może istnieć dowolna liczba obiektów w łańcuchu prototypów, z których - licząc od dołu - pobierane będą własności nieobecne bezpośrednio w anObject.

Dotychczasowe operacje na własnościach

Ograniczenia

Próby obchodzenia ograniczeń

ES5 (oraz JS 1.8.5) rozwiązuje te problemy

Nowe metody obiektu Object:

Object.defineProperty()

Object.defineProperty()

Object.defineProperty(obj, prop, descriptor)

Deskryptor własności

Obiekt o następujących własnościach:

...able są domyślnie false; pozostałe: undefined

Deskryptor własności: trywialny przykład


// odpowiednik: obj = { x: 42; }
obj = {};
Object.defineProperty(obj, "x", {
  writable: true,     // będzie można ustawic wartość
  enumerable: true,   // będzie widać w for-in, in
  configurable: true, // będzie można zmienić deskryptor
  value: 42
});

Deskryptor własności: lepszy przykład :)

obj = { _x: 5 };
Object.defineProperty(obj, "x", {
  enumerable: false,   // nie będzie widać "x" w for-in, in
  configurable: false, // nie będzie można zmienić deskryptora
  get: function () {  return this._x;  },
  set: function (newValue) {
    if (newValue < 10) {
        this._x = newValue;
    } else {
        this._x = -1;
    }
  }
});        // [demo (lokalnie)]

Deskryptor własności: lepszy przykład :)

Object.getOwnPropertyDescriptor()

Object.defineProperties()

Object.preventExtensions()

Object.seal()

Object.freeze()

preventExtensions, seal, freeze...

Object.create()

Object.create(): przykład trywialny

Object.create(): lepszy przykład

Zdjęcie: © Aconcagua @ WikiMedia Commons, CC-by-SA-3.0

Object.create(): lepszy przykład


var volumeButton = {
  delta: 0, // o ile zmienia się głośność
  onActivate: function () {
    someAudioPlayer.volume += this.delta;
  }  // ...
};

var volumeUpButton   = Object.create(volumeButton),
    volumeDownButton = Object.create(volumeButton);

volumeUpButton.delta   = 1;
volumeDownButton.delta = -1;

Object.keys()

Object.getOwnPropertyNames()

Gdzie działa?

Co robić?

Hack!

Dziękuję za uwagę