38

私はこれが大丈夫かどうか尋ねていません:

Object.prototype.method = function(){};

これは、混乱していることを考えると、ほとんどすべての人にとって悪と見なされていますfor(var i in obj)

本当の質問

無視する

  • 能力のないブラウザ(サポートしていないブラウザObject.defineProperty
  • プロパティの衝突またはオーバーライドの可能性

あなたが信じられないほど便利な方法を持っていると仮定すると、これは間違っている/非倫理的であると考えられていますか?

Object.defineProperty(Object.prototype, 'methodOnSteriods',{
  value: function(){ /* Makes breakfast, solves world peace, takes out trash */ },
  writable: true,
  configurable: true,
  enumerable: false
});

上記が非倫理的であるとあなたが信じるなら、なぜ彼らはそもそもその機能を実装するのでしょうか?

4

5 に答える 5

25

2021年からの更新

これは受け入れられた答えですが、10年の経験から、これは最善のアイデアではないことがわかりました。グローバルスコープの汚染を回避するためにできることはほとんど何でも非常に良いことです。

後世のために、そしてスタックオーバーフローが受け入れられた答えを削除させないので、以下の元の答え。


2011年からの元の回答

ターゲット環境で動作するのであれば問題ないと思います。

また、プロトタイプの拡張パラノイアは誇張されていると思います。hasOwnProperty()優れた開発者のように使用する限り、それはすべて問題ありません。最悪の場合、そのプロパティを他の場所でオーバーロードし、メソッドを失います。しかし、そうするのはあなた自身の責任です。

于 2011-07-29T18:00:40.560 に答える
10

これは以前とほぼ同じくらい邪悪だと思います。最大の問題は、以前と同じですが、Object.prototypeがグローバルであるということです。あなたの方法は現在世界平和を解決しているかもしれませんが、他の誰かの方法(銀河の平和を保証していた)を上書きしたか、将来あなたが制御できないライブラリによって上書きされる可能性があります(したがって、世界を再び混乱に陥れます)


Javascriptの新しいバージョンには、プロパティに関連する多くの機能があります。たとえば、プロパティを列挙可能/列挙不可能に定義したり、ゲッターとセッターを使用したりします。Object.definePropertyは、これを制御します。

Mozilla Docsから:

このメソッドを使用すると、オブジェクトのプロパティを正確に追加または変更できます。割り当てによる通常のプロパティの追加により、プロパティの列挙中に表示されるプロパティが作成されます(for ... in loop)。その値は変更される可能性があり、削除される可能性があります。この方法では、これらの追加の詳細をデフォルトから変更できます。


この新機能は基本的に新機能をサポートするために必要であり、あなたはそれをあなた自身のもので使うことになっています。Object.prototypeを変更できることは、それが「通常の」オブジェクトであることの単なる副作用であり、以前と同じように悪です。

于 2011-07-29T18:00:15.173 に答える
3

「JavaScript:良い部分」にも同様の関数があります。これは、javascriptベースオブジェクト(String、Dateなど)を改善するのに非常に便利だと思いますが、それだけです。

// Add a method conditionally. from "JavaScript: the good parts"

Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
    }
}
于 2011-07-29T18:29:44.347 に答える
3

.hasOwnProperty()継承されたプロパティを介した反復を除外します。これは、個人的には役立つよりも煩わしいことがよくあります。誰もがそうするように説得した同じ男も昇進しObject.create()たので、それは皮肉なことに、の有用性を大幅に打ち負かします。.hasOwnProperty()Object.create()

ここにリストされている理由により、Object.prototypeを拡張しないでください。本当に拡張したい場合は、拡張を反復不可にします。

これは、公開されているすべてのベストプラクティスに直面していることを認識していますが、.hasOwnProperty()オブジェクトキーの反復に対する「強制」をやめ、オブジェクトからオブジェクトへの直接継承の有用性を受け入れる必要があります。

于 2016-09-15T21:48:28.080 に答える
0

簡単な答えは「はい、あなたはそれをすべきです」です。

それを行う前に、いくつかの予防措置を講じる必要があり
ます。1.hasOwnPropertyオブジェクトを反復するときに使用しますが、これは実際には予防策ではありません。オブジェクトを反復するときに、hasOwnPropertyとにかくすでに使用しています。
2. nameinObject.prototype.nameが存在するかどうかを確認します。これは、名前の衝突を避けるために非常に安全です。
3.を利用しObject.defineProperty()、セーフガードレイヤーを追加するだけです。

ご覧のとおり、それほど複雑ではありません。

リスク/デメリットに対処すると、次のようなメリットがあります
。1.メソッドの連鎖。これにより、コードが読みやすく簡潔になり、コーディングがより楽しくなります。順番にあなたは幸せになり、あなたの人生は楽になります。
2.ブラウザの互換性の問題を解決します。とにかくポリフィルを実行しています。

PS:
大規模なチームで作業する場合は、絶対に行わないでください。

于 2016-08-31T04:56:05.617 に答える