Object.defineProperty no ES5?

Estou vendo posts sobre um ‘novo’ Object.create que torna a enumeração configurável. No entanto, ele depende de um método Object.defineProperty. Não consigo encontrar uma implementação entre navegadores para esse método.

Estamos preso escrevendo para o antigo Object.create? Não consigo escrever coisas que não funcionem no IE6 / 7.

Há várias coisas que você não pode emular do método ECMAScript 5 Object.create em um ambiente ECMAScript 3.

Como você viu, o argumento properties lhe dará problemas, pois nas implementações baseadas no E3 não há como alterar os atributos da propriedade.

O método Object.defineProperty como @Raynos mencionado, funciona no IE8, mas parcialmente , ele pode ser usado somente em elementos DOM.

Também as propriedades do acessador lhe darão problemas, elas podem ser imitadas com methods não padrão amplamente suportados, como __defineGetter__ / __defineSetter__ , mas, novamente, você não pode alterar os atributos da propriedade .

Outro problema, além dos descritores de propriedade, é que o método Object.create pode aceitar null como um argumento, para criar um object que não herda de nada.

Isso não pode ser emulado com a correção Object.create de Crockford , porque quando o new operador é usado com uma function construtora que possui uma propriedade prototype contendo null – ou qualquer outro valor não object -, o object recém-criado herdará de Object.prototype qualquer maneira por padrão.

Em algumas implementações -V8, Spidermonkey, Rhino, etc …- eles têm uma propriedade __proto__ __proto__ que pode ser usada para definir um [[Prototype]] null , mas, novamente, isso não é padrão, e com certeza nunca funcionará no IE.

Eu recomendaria, se você quiser segmentar navegadores antigos para não usar esses resources, pois não há como fazê-los funcionar corretamente nesses ambientes.

Se você ainda quiser usar o Object.create , sem usar o argumento properties , você pode, no entanto, eu recomendo que você detecte as coisas que não podem ser emuladas.

O seguinte seria uma versão mais segura do shim Object.create do Crockford :

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

De qualquer forma, use-o com cuidado.

Se você quer uma boa implementação defineProperty (), dê uma olhada em https://github.com/kriskowal/es5-shim

Infelizmente, você não pode tornar a enumeração configurável em um ambiente ES3. Esse shim permitirá que você chame a API em qualquer ambiente, mas as propriedades ainda serão enumeráveis ​​no ES3.

Por que vale a pena

Object.defineProperty funciona em ie8 e FF4.

Isso significa que vale a pena apresentar sniff e implementá-lo onde for útil, já que você esperaria que a atualização de 6/7 para 8/9 ocorresse nos próximos anos.

Outra coisa a ser cauteloso é que a propriedade dontEnum tem um bug no JScript

Você terá que contornar a maneira que você usa a propriedade dontEnum no IE.

[Editar]:

Aqui está a documentação do Internet Explorer e um link para a especificação do ES5 (Página 122, 15.2.3.6)

Intereting Posts