グローバルオブジェクトの一部の組み込みプロパティを削除できるのはなぜですか?


12

私は最近es5を読んでいますが、グローバルオブジェクトの一部の組み込みプロパティの[[configurable]]属性がtrueに設定されていることがわかります。つまり、これらのプロパティを削除できます。

例えば:

Array.prototypeオブジェクトのjoinメソッドには属性があります

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

したがって、Arrayのjoinメソッドを簡単に削除できます。

delete Array.prototype.join;
alert([1,2,3].join);

アラートはundefined、私のクロム17、Firefox 9、つまり10、つまりIE6に表示されます。

Chrome 15およびsafari 5.1.1では、[[configurable]]属性がtrueに設定され、削除結果もtrueに設定されていますが、最終結果はまだfunction(){[native code]}です。これはバグのようで、クロムはそれを修正します。

以前は気づいていませんでした。私の意見では、ユーザーのコードの組み込み関数を削除することは危険であり、他のユーザーと作業するときに非常に多くのバグを引き起こします。


複数の回答は、プロパティを削除することで組み込み機能をカスタマイズする機能を賞賛していますが、このアプローチは、機能がDIを使用する代わりにグローバル変数に組み込まれているために必要です。プロパティを削除してカスタマイズすることは、根本的に悪いデザインのハックのようです。たとえば、JSONパーサーを変更できるようにする必要がある場合、入力としてJSONパーサーを受け取るコードを作成できます。
モニカの

回答:


2

私はあなたに同意する傾向がありますが、一方で、Firefox 3.5のバグのdelete JSON.stringifyために特定の状況で必要な状況を見つけました。私は確かに、ビルトインにサルパッチを適用する機能が嬉しかったです。


なぜそれをオーバーライドしないのですか?
デミックス

2
次に発生するのはJSON2.jsがロードされるためです。JSON2.jsはJSON.stringify必要に応じて存在を検出して挿入します。おApび申し上げますが、答えでは説明しませんでした。
N3dst4

そのため、JSON2.jsのソースコードも変更できます、笑
demix

サードパーティのライブラリを変更することはお勧めできません。すべての変更をコピーしないとアップグレードできないためです。
N3dst4

1

構成可能とは削除に関するものではありません。

読み取り専用の値を置き換える機能についてです。

これは非常に強力なツールであり、構成できない値は、削除できないとイライラします。

あいまいなバグを修正したり、わずかに異なる機能(傍受、ログ記録)を挿入したりする必要があるケースがかなりありました。そのためは、値を置き換える必要あります。

例:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

全体的な考え方は、プロパティを削除できる場合、メタプログラミングの制御が強化されるということです。それらを削除できなかった場合は、その言語に悩まされることになります。

人々を困らせる以外に、プロパティを削除不可にする正当な理由はありません。


1
[[writable]]属性は値を変更する機能を制御します。ES5の場合:[[Writable]] Boolean falseの場合、ECMAScriptコードが[[Put]]を使用してプロパティの[[Value]]属性を変更しようとしても成功しません。 .[[Configurable]] Boolean falseの場合、プロパティの削除、プロパティのアクセサプロパティへの変更、またはその属性([[Value]]以外)の変更は失敗します。
デミックス

@demixはい、それは正しいです...
Raynos

0

..ユーザーのコードの組み込み関数を削除するのは危険です

まったく逆です。カスタマイズを許可すると、Webサイトの作成者がより柔軟に対応できるため、優れています。

ウェブサイト作成者が同じJS VM内のサードパーティのコードをロードする必要がある場合そうするために作り付けのJSパーサを使用したい、彼は常に安全な性質をすることができ、サードパーティのコードをロードする前に、設定不可にそれらを設定することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.