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.
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.
Zawsze jest ramka Chrome! – kzh