ES3 では、次のように削除が 8.6.2.5 と 11.4.1 で導入されます
情報があります、
1. 実装内の削除オペレーターは、エンジン内で [[Delete]] メソッドを呼び出します
2. [[削除]] は 8.6.2
で定義されています。
3. 削除された属性に DontDelete 機能がある場合、
を削除するときに直接 false が返されます。
「DontDelete」を検索すると、次のどれも削除できません
が見つかります。
1、オブジェクト (10.1.6) の引数オブジェクトをアクティブ化します
関数 func() {
引数を削除します。
}
func(1); 、変数宣言 (10.2. 1)
コードをコピー
alert(a); // 10
この記事は、var を使用して宣言された変数は削除できないことを示しています。
3、関数宣言
コードをコピー
alert(func) // func コード
4、関数の長さ属性
copy コード
コードは次のとおりです。function func(a, b) {} delete func.length; alert(func.length); / / 2
5、一部の定数 (NaN、無限大、未定義)
コードをコピー
6、組み込みコンストラクターのプロトタイプ
コードをコピー
delete Error.prototype; // false
delete Boolean.prototype; // false
7、配列と文字列の長さの場合
コードをコピー
コードは次のとおりです:
コードをコピー
コードは次のとおりです:
delete Math.E; // false
...
9、通常のオブジェクトのプロパティ (source、global、ignoreCase、multiline、lastIndex)コードをコピー
コードは次のとおりです
var reg = /ss/;
reg ソースを削除します; // false
...
ES5 は ES3 とは異なり、「DontDelete」はありませんが、[[Configurable]] (8.6.1) が追加されています。
値が false の場合、上記 9 点は ES5 では [[Configurable]] が false として記述されています。
ES5 の新しい Object.defineProperty メソッドは、次のように定義されたオブジェクトの Configurable を表示できます
var obj = {name: 'John'};
Object.defineProperty(obj, "key", {
構成可能: false,
value: " static"
});
delete obj.name; // true
delete obj.key // false
オブジェクト obj には名前とキーがあります。名前は削除できますが、キーは削除できません。
さらに、ES5 厳密モードでは、構成可能値が false のオブジェクトを削除すると、例外が直接スローされます。たとえば、
"use strict";
delete Object.prototype;
FF のコンソールは次のエラーを報告します
削除できない組み込みオブジェクトの一部のメソッドまたはプロパティに加えて、削除できないカスタム オブジェクトもあります。たとえば、プロトタイプから継承したプロパティは削除できません。
function person() {}
person.prototype.name = 'John Backus';
var p = new Person();
delete p.name; .name); // まだ出力 John Backus
これとプロトタイプに名前がある場合、削除後にプロトタイプが表示されます
function Person() {
this.name = 'John Backus'
}
person.prototype .name = 'John Resig';
var p = new Person();
console.log(p.name); // ジョン・バッカス
delete p.name;
console.log( p.name); // John Resig、プロトタイプから
プロトタイプ上の名前を削除する必要がある場合は、
delete Person.prototype.name
要約すると、
1. 組み込みオブジェクトのほとんどのプロパティとメソッドは削除できません (ただし、isNaN、parseInt などの一部は削除できます)
2. オブジェクトがプロトタイプから継承するプロパティとメソッドは削除できません
その理由も非常に単純です、
1. 組み込みオブジェクトのほとんどのプロパティとメソッドは、言語のコア API を保護するために削除できません。これらの API は、削除されると基本的に役に立ちません。 Object.prototype の削除など。
2. オブジェクトがプロトタイプから継承する属性とメソッドは、プロトタイプを保護するために削除できません。そうでない場合、「クラス A のオブジェクトがプロトタイプの属性を削除すると、A から継承されたすべてのオブジェクトはその属性を失います。」 。」