8

ES5はにいくつかメソッドを追加しましたがObject、これはJavaScriptのセマンティックの一貫性を損なうようです。

たとえば、この拡張機能の前は、JavaScriptAPIは常にオブジェクト自体の操作を中心に展開していました。

var arrayLength = [].length;
var firstPosInString = "foo".indexOf("o");

...新しいObjectメソッドは次のようになります。

var obj = { };
Object.defineProperty(obj, {
    value: 'a',
    writable: false
});

...次の方がはるかに適合している場合:

var obj = { };
obj.defineProperty({
    value: 'a',
    writable: false
});

なぜこれなのかという私の好奇心を冷やすことができますか?これが壊れるコードスニペットはありますか?なぜこのアプローチを選んだのかについて、標準化委員会によって行われた公開討論はありますか?

4

2 に答える 2

8

これはすべて、Allen Wirfs-Brock自身(ES5仕様の編集者であり、TC39のメンバー)による「提案されたECMAScript 3.1静的オブジェクト関数:ユースケースと理論的根拠」ドキュメント(pdf)で非常にうまく説明されています。

私はそれをすべて読むことをお勧めします。それはかなり短く、簡単に消化でき、これらのES5追加の背後にある思考プロセスを垣間見ることができます。

しかし、関連するセクションを引用するには(私の強調):

提案されたAPIが選択される前に、いくつかの代替API設計が検討されました。代替案を検討する過程で、代替案を検討する際に適用する一連の非公式ガイドラインを作成しました。これらのガイドラインは次のとおりです。

  • メタ層とアプリケーション層をきれいに分離します。
  • APIの表面積(つまり、メソッドの数と引数の複雑さ)を最小限に抑えるようにしてください。
  • ネーミングとパラメータ設計の使いやすさに焦点を当てます。
  • デザインの基本的な要素を繰り返し適用してみてください。
  • 可能であれば、プログラマーまたは実装がAPIの使用を静的に最適化できるようにします。

[...]

選択された設計につながると考えられたいくつかの選択肢を次に示します。

既存の標準メソッドObject.prototype.propertyIsEnumerableの例に従った明らかな最初のアイデアは、他の属性のObject.prototypeに追加の「propertyIs ...」クエリメソッドと、属性変更メソッドの並列セットを追加することでした。

[...]

このアプローチを検討したとき、私たちが気に入らなかったことがいくつかあり、それは上記のAPI設計ガイドラインに反しているように見えました。

  • メタ層とアプリケーション層を分離するのではなく、マージします。Object.prototypeのメソッドとして、メソッドはプログラム内のすべてのアプリケーションオブジェクトのパブリックインターフェイスの一部になります。そのため、ライブラリ設計者だけでなく、すべての開発者が理解する必要があります。

[...]

于 2012-03-17T00:38:33.737 に答える
1

JavaScript APIは、常にオブジェクト自体の操作を中心に展開されていました。

これは正しくありません。たとえばJSONMath常に独自のメソッドがありました。誰もそのようなことをしません:

var x = 0;
x.cos(); // 1.0
({"a":[0,1],"p":{"x":3,"y":4}}).toJSON();

Object.prototype拡張が悪いことである理由については、Web上に多数の記事があります。はい、それらはクライアントコードに関するものですが、これは組み込みメソッドにとってもいくつかの点で悪いかもしれません。

于 2012-03-16T10:12:07.587 に答える