2010-09-30 16 views
8

Widzę posty o "nowym" Object.create, który umożliwia konfigurowanie wyliczenia. Opiera się jednak na metodzie Object.defineProperty. Nie mogę znaleźć implementacji krzyżowej przeglądarki dla tej metody.Object.defineProperty w ES5?

Czy utknęliśmy na pisanie starego obiektu Object.create? Nie mogę pisać rzeczy, które nie będą działać w IE6/7.

+3

Zawsze jest ramka Chrome! – kzh

Odpowiedz

14

Istnieje kilka rzeczy, które nie może emulować z ECMAScript 5 Object.create metody w środowisku ECMAScript 3.

Jak widzieliście, argument właściwości spowoduje problemy, ponieważ w implementacjach opartych na E3 istnieje nie sposób, aby zmienić atrybuty właściwości.

W Object.defineProperty sposób jak @Raynos wspomniano, działa na IE8, ale częściowo, może być stosowany tylkow elementach DOM.

także właściwości dostępowe daje problemy, mogą być naśladował z szeroko wspieranych niestandardowych metod, takich jak __defineGetter__/__defineSetter__, ale znowu, nie można zmienić właściwość atrybuty.

Innym problemem oprócz deskryptorów właściwości jest to, że metoda Object.create może przyjąć null jako argument, aby utworzyć obiekt, który niczego nie dziedziczy.

nie mogą być emulowane z Crockford's Object.create shim, ponieważ kiedy operator new stosuje się z funkcją konstruktor ma właściwość prototype zawierający null -OR dowolnych innych obiektów Value- nowo tworzony obiekt będzie dziedziczyć Object.prototype tak czy inaczej domyślnie.

W niektórych implementacjach -V8, Spidermonkey, Rhino, itp ...- mają setteable __proto__ właściwości, które mogą być używane do ustawiania null [[Prototype]], ale znowu, że to nietypowe, a na pewno to nigdy nie zadziała na IE.

Polecam, jeśli chce się kierować na stare przeglądarki, aby nie korzystać z tych funkcji, ponieważ nie ma możliwości ich poprawnego działania w tych środowiskach.

Jeśli nadal chcesz używać Object.create, bez używania argumentu o wartości , możesz jednak polecić wykrycie rzeczy, których nie można emulować.

Poniższa byłoby bezpieczniejsze wersja Crockford's Object.create shim:

if (typeof Object.create != 'function') { 
    (function() { 
    var F = function() {}; 
    Object.create = function (o) { 
     if (arguments.length > 1) { throw Error('Second argument not supported');} 
     if (o === null) { throw Error('Cannot set a null [[Prototype]]');} 
     if (typeof o != 'object') { throw TypeError('Argument must be an object');} 
     F.prototype = o; 
     return new F; 
    }; 
    })(); 
} 

Zresztą używać go ostrożnie.

2

Na co warto,

Object.defineProperty prace w IE8 i FF4.

Oznacza to, że warto go podsłuchiwać i zaimplementować tam, gdzie jest to przydatne, ponieważ można mieć nadzieję, że aktualizacja z 6 do 8 będzie następować w ciągu najbliższych kilku lat.

Inną rzeczą, aby uważać na to, że nieruchomość dontEnum ma błąd w JScript

trzeba będzie obejść sposobu korzystania z własności dontEnum w IE.

[Edit]:

Oto dokumentacja Internet explorer oraz link do ES5 specification (strona 122, 15.2.3.6)

+0

To dobrze wiedzieć, że jest w IE8, zobaczyłem, co mogło być implementacją. Moje pytanie brzmi: czy istnieje opublikowana implementacja defineProperty? – Drew

+0

Nie ma takiej realizacji dla ie6/7 obawiam się. – Raynos

+4

@Drew: 'Object.defineProperty' działa * częściowo * IE8, możesz go używać tylko w * DOM Elements *. Zostawiłem [answer] (http://stackoverflow.com/questions/3830800/object-defineproperty-in-es5/3844768#3844768), co w skrócie mówi: Nie możesz. Atrybuty właściwości nie mogą być zdefiniowane w implementacjach opartych na ECMAScript 3. .... – CMS

4

Jeśli chcesz dobry defineProperty() realizacja, przyjrzeć https://github.com/kriskowal/es5-shim

Niestety, nie można dokonać wyliczenia konfigurowalny w środowisku ES3. Ta podkładka pozwoli ci wywołać API w dowolnym środowisku, ale właściwości będą nadal możliwe do wyliczenia w ES3.

+0

To naprawdę fajne, dzięki – Drew

Powiązane problemy