No ES3, delete é introduzido em 8.6.2.5 e 11.4.1, como segue
Há algumas informações,
1. O operador delete na implementação chamará o método [[Delete]] dentro do mecanismo.
2. [[Excluir]] é definido em 8.6.2
3. O atributo excluído possui o recurso DontDelete. Nesse caso, false será retornado diretamente ao excluir.
Procure por "DontDelete" e você encontrará muitos dos itens a seguir que podem ser excluídos.
1. Ative o objeto de argumentos do objeto (10.1.6)
Copie o código do código da seguinte forma:
função função() {
excluir argumentos;
alerta(argumentos);
}
função(1);
2. Declaração de variável (10.2.1)
Copie o código do código da seguinte forma:
var a = 10;
excluir um;
alerta(a); // 10
Este artigo é mencionado em muitos livros JS, ou seja, variáveis declaradas usando var não podem ser excluídas.
3. Declaração de função
Copie o código do código da seguinte forma:
função função() {}
excluir função;
alerta(func); // código de função
4. O atributo de comprimento da função
Copie o código do código da seguinte forma:
função função(a, b) {}
excluir func.length;
alerta(func.comprimento); // 2
5. Algumas constantes (NaN, Infinito, indefinido)
Copie o código do código da seguinte forma:
excluir NaN; // falso
excluir infinito; // falso
excluir indefinido; // falso
6. Protótipo de construtor integrado
Copie o código do código da seguinte forma:
excluir Object.prototype; // falso
excluir Function.prototype; // falso
excluir Array.prototype; // falso
excluir ExpReg.prototype; // falso
excluir Data.prototype; // falso
excluir Error.prototype; // falso
excluir Número.prototype; // falso
excluir Boolean.prototype; // falso
excluir String.prototype; // falso
7. O comprimento de arrays e strings
Copie o código do código da seguinte forma:
var arr = [], str = 'olá';
exclua arr.length;
excluir str.length;
8. Propriedades do objeto Math (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Copie o código do código da seguinte forma:
excluir Math.E;
...
9. Propriedades de objetos regulares (fonte, global, ignoreCase, multiline, lastIndex)
Copie o código do código da seguinte forma:
var reg = /ss/;
excluir reg.source;/falso
...
ES5 é diferente do ES3 Não há "DontDelete" no ES5, mas [[Configurable]] (8.6.1) foi adicionado.
Se o valor for falso, ele não poderá ser excluído. Os nove pontos listados acima são descritos no ES5 como [[Configurável]] é falso.
O novo método Object.defineProperty no ES5 pode exibir o Configurable do objeto definido, como segue
Copie o código do código da seguinte forma:
var obj = {nome: 'João'};
Object.defineProperty(obj, "chave", {
configurável: falso,
valor: "estático"
});
excluir obj.nome; // verdadeiro
excluir obj.key // falso
O objeto obj possui nome e chave. O nome pode ser excluído, mas a chave não.
Além disso, no modo estrito ES5, uma exceção será lançada diretamente ao excluir um objeto cujo configurável seja falso. como
Copie o código do código da seguinte forma:
“usar estrito”;
excluir Object.prototype;
O erro do console no FF é o seguinte:
Além de alguns métodos ou propriedades de objetos integrados que não podem ser excluídos, também existem objetos personalizados que não podem ser excluídos. Por exemplo, delete não pode excluir um objeto que herda propriedades do protótipo.
Copie o código do código da seguinte forma:
função Pessoa() {}
Person.prototype.name = 'John Backus';
var p = new Pessoa();
excluir p.nome;
console.log(p.name); // Ainda produz John Backus
Se houver um nome neste protótipo, após a exclusão, o protótipo será exibido.
Copie o código do código da seguinte forma:
função Pessoa() {
this.name = 'John Backus';
}
Person.prototype.name = 'John Resig';
var p = new Pessoa();
console.log(p.nome); //John Backus
excluir p.nome;
console.log(p.name); // John Resig, do protótipo
Se você tiver que excluir o nome do protótipo, você só poderá
Copie o código do código da seguinte forma:
excluir Person.prototype.name
Para resumir:
1. A maioria das propriedades e métodos de objetos integrados não podem ser excluídos (embora alguns possam ser excluídos, como isNaN e parseInt)
2. As propriedades e métodos que um objeto herda do protótipo não podem ser excluídos.
A razão também é muito simples,
1. A maioria das propriedades e métodos dos objetos integrados não podem ser excluídos para proteger a API principal da linguagem. Depois que essas APIs são excluídas, elas se tornam basicamente inúteis. Como excluir Object.prototype.
2. Os atributos e métodos que um objeto herda do protótipo não podem ser excluídos para proteger o protótipo. Caso contrário, "se um objeto da classe A excluir um atributo do protótipo, todos os objetos herdados de A perderão o atributo".