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