2016-01-12 3 views
8

これは、組み込みのJavaScriptのプロトタイプpredominant opinionを延長(またはいずれかの方法で変更)すべきではないです。組み込みのJavascriptプロトタイプの拡張も避けなければなりませんか?

​​

この規則は、ES2015シンボルに適用されますか? symbolので

const empty = Symbol("empty"); 
Array.prototype[empty] = function empty() { return this.length === 0; } 

は、定義によって名前の競合を全くオブジェクトのプロパティが存在しないことができるstring(プリミティブ、不変)とobject(アイデンティティ)の混合物です。

通常のオブジェクトの反射は、シンボルの影響を受けません。Reflect.ownKeys(Array.prototype)

Object.getOwnPropertyNames(Array.prototype).indexOf("empty"); // -1 

しかし、ES2015反射があります。

この質問は、主に今後Reflect.ownKeysObject.getOwnPropertySymbolsの使用方法についてです。

+1

組み込み関数のサブクラス化ができることを忘れないでください。組み込み関数のプロトタイプを拡張しないもう一つの理由があります。 – CodingIntrigue

+1

@RGrahamなぜこの質問をしたのかの主な理由は、またはシンボルのエッジの場合は、比較的新しい機能であるためです。私は実際に組み込みのプロトタイプを拡張しないと思う。 – rand

答えて

2

はい。

  1. あなたが名前の衝突を引き起こす可能性がありますし、あなたがそのコードを破ることができます。

    は「あなたが所有していない何かを変更しない」ルールには2つの部分があります。

    あなたが所有していないものに触れると、他のライブラリで使用されていたものを誤って上書きすることがあります。これにより予期しない方法でコードが破損します。

  2. あなたがタイトな依存関係を作成することができます

    彼らはあなたコードを破ることができます。

    あなたのコードを他のオブジェクトと緊密に結びつけることで、(クラスの削除や名前の変更などの)大きな変更が行われた場合、コードが突然破損することがあります。

記号を使用すると#1は避けられますが、それでも#2は実行されます。そのようなクラス間の緊密な依存関係は、一般的にはお勧めできません。他のクラスがfrozenの場合、コードは引き続き破損します。若干異なる理由のためにのanswersが依然として適用されます。

より良いテスト(緩やかなバインディングは簡単に模擬することができます)とメンテナンスが容易です(いくつかの明白な接続では、文書化や更新が容易です)。

明確にする:名前の衝突は、密接な依存関係によって引き起こされる問題の単なる症状です。

+0

@IvenMarquardt ES6または古典的なプロトタイプの場合、影響は同じです。あなたは契約なしで何かに双方向の依存関係を作り出しています。 'String.prototype.substr'を使うことは、安全かつ一方向の依存関係です。関数を使うと、関数が存在し、どのように動作するのかを示す規約が提供されます。 'String.prototype'に何かを注入する方がよりラウンドアラウンドであり(あなたはそれらを修正して使用します)、通常は可能であるという契約を提供しません。 – ssube

+0

最後に、これは「それは危険で、それに触れないでください。それは実生活を退屈にしますが、コードは安定しています*。 – ssube

+0

しかし、Array.prototypeのインスタンスを作成して不変(フリーズ)にすると、 'push'や' pop'なども壊れてしまいます。別の具体的な例がありますか? – rand

関連する問題