ECMAScript 5

Marek Stępień

Ecma International

– dawniej European Computer Manufacturers' Association

ECMAScript

ECMAScript 3

ECMAScript 4

ECMAScript 3.1 / 5 / 5.1

ES 5: co nowego?

ES 5: co nowego?

Kto wspiera ES5?

JSON

Funkcje dowiązane

Przykład

[#foo]
// dotychczas:
document.getElementById("foo").onclick = function () {
	c0nsole.write("kliknięto foo");
}

Nowości w Array

Array: funkcje wyższego rzędu

every, some

arr.every(function (arrayItem, index, array) {/*...*/})

- sprawdza, czy każdy element tablicy spełnia warunek

arr.some(function (arrayItem, index, array) {/*...*/})

sprawdza, czy choć jeden element spełnia warunek

filter

arr.filter(function (arrayItem, index, array) {/*...*/})

- zwraca nową tablicę złożoną z elementów oryginalnej tablicy spełniających warunek

map

arr.map(function (arrayItem, index, array) {/*...*/})

zwraca nową tablicę złożoną z elementów oryginalnej tablicy przekształconych przez funkcję-argument

forEach

arr.forEach(function (arrayItem, index, array) {/*...*/})

wywołuje zadaną funkcję na każdym elemencie tablicy (będzie jej argumentem)

reduce

arr.reduce(function (accum, currVal, index, array){/*...*/}, initialVal)

Wykonuje funkcję na akumulatorze i każdej wartości tablicy (od lewej do prawej), by uprościć ją do pojedynczej wartości.

reduce

arr.reduce(function (accum, currVal, index, array){/*...*/}, initialVal)

Podanie initialVal sprawia, że accum będzie w pierwszym przebiegu równy initialVal, a currVal = arr[0]. Niepodanie initialVal (jak poprzednio) sprawia, że accum w pierwszym przebiegu jest równy arr[0], a currVal = arr[1].

reduceRight

arr.reduceRight(function (accum, currVal, index, array){/*...*/}, initialVal)

Działa analogicznie jak reduce, z tym że zaczyna od końca i kieruje się do początku tablicy.

Date i String - nowości

Tryb ścisły (Strict Mode)

Tryb ścisły (Strict Mode)

Obiekty. Na nowo.

Zanim powiemy, co jest nowe, przypomnijmy, co było dotychczas możliwe w JS.

Typowy obiekt JS

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

Ł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 - poczynając od dołu - pobierane będą własności nieobecne bezpośrednio w anObject.

Operacje na własnościach

Ograniczenia

Próby obchodzenia ograniczeń

ES5 rozwiązuje te problemy

Nowe metody obiektu Object:

defineProperty(), defineProperties(), getOwnPropertyDescriptor(), create(), seal(), isSealed(), freeze(), isFrozen(), preventExtensions(), isExtensible(), keys(), getOwnPropertyNames()

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

Zamiast obj = {x: 42};

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

Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor(obj, propName)

pozwala pobrać deskryptor istniejącej własności.

Object.defineProperties()

To samo, co defineProperty(), ale pozwala jednocześnie zdefiniować więcej własności.

Object.defineProperties(obj, {
  prop1Name: prop1Descriptor,
  prop2Name: prop2Descriptor,
  // ...
  propKName: propKDescriptor
});

Object.preventExtensions()

uniemożliwia dodawanie nowych własności do obiektu - nikt nie będzie nam nic dopisywał do naszego obiektu

Istniejące własności można usuwać (delete), można zmieniać ich deskryptory, a także wartość.

Object.isExtensible(anObj) informuje o rozszerzalności obiektu

Object.preventExtensions()

Object.seal()

zapieczętowuje obiekt, tj. uniemożliwia dodawanie kolejnych i konfigurowanie/usuwanie istniejących własności:

Object.isSealed(anObj) informuje, o zapieczętowaniu obiektu

Object.seal()

Object.freeze()

zamraża obiekt, uniemożliwiając jakiekolwiek modyfikacje:

Object.isFrozen(anObj) informuje, o zamrożeniu obiektu

Object.freeze()

preventExtensions, seal, freeze...

metoda \ operacje zmiana
wartości
konfi-
gurowanie
dodawanie
nowych
(brak)
preventExtensions() -
seal() - -
freeze() - - -

Object.create()

Object.create(): przykład trywialny

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()

ES „Harmony” (ES6)

Dziękuję za uwagę!

Pytania?

Silnik slajdów: niesamowity CSSS (autorka: Lea Verou; MIT License) plus sklecone na szybko pluginy mojego autorstwa :P

Tło: bez tytułu, John Wilson (Flickr: johnwilson1969; CC-BY-SA)