8

私はJavaScriptプロジェクトに取り組んでおりdefineProperty()、スーパークラス(スーパーオブジェクト?)メソッドを呼び出すのではなく、オブジェクトインスタンスがおよび他のメソッドを継承しないのはなぜか疑問に思っていましObjectた。

MDNドキュメントを見てきましたが、実際には「非標準」のプロパティメソッドがあります。

ただし、これらは非推奨です。なぜObjectメソッドに移行するのでしょうか?

instance.defineProperty(...)のようなものがより良いように私には思えObject.defineProperty(instance, ...)ます。他のいくつかのObjectメソッドについても同じことが言えます。

4

3 に答える 3

9

衝突を避けるためです。一般に、期待する値のプロパティを持たないオブジェクトの問題です。
JS のオブジェクトは多くの場合、キーと値のマップとして使用され、キーは任意の文字列にすることができ__defineGetter__ますhasOwnProperty。未知のオブジェクトでそのような関数を呼び出したい場合hasOwnProperty(JSON が渡される可能性のある一般的な列挙関数でよく使用されるように)、上書きされたプロパティを取得したかどうかを確認することはできません (それは関数でさえない可能性があります)。 )または必要なオリジナル、またはオブジェクトがプロパティをまったく継承するかどうか。この問題 (またはこの IE のバグ) を回避するには、使用する必要がありますObject.prototype.hasOwnProperty.call- それは醜いです。

したがって、これらすべての関数の名前空間Objectは有用であるだけであり、リフレクション メソッドをオブジェクトのアプリケーション インターフェイスから分離するクリーンな API です。これは最適化 (静的分析の簡素化) にも役立ち、サンドボックス内のリフレクション API へのアクセスをより簡単に制限できるようになります。少なくともそれが設計上のアイデアでした。

プロトタイプを試してみるのもいいかもしれませんが、defineProperty安全に使用できるのは、既知のオブジェクトを操作する場合のみです。それでも必要な場合は(いつ使用するか、いつ使用しないかを知っているため)、使用できます

Object.defineProperty(Object.prototype, "defineProperty", {
    writable: true,
    enumberable: false,
    value: function(prop, descr) {
        return Object.defineProperty(this, prop, descr); 
    }
});
于 2012-11-05T21:23:11.750 に答える
5

Object.prototype衝突を避けるためにそのように行われます - 上のすべてのメソッドは、すべての単一のユーザー定義オブジェクトのメソッドでもあることを覚えておいてください。

カスタムメソッドが必要なオブジェクトを想像してみてください。代わりに、プロトタイプにdefinePropertyあると完全に壊れてしまいます。Object.defineProperty

于 2012-11-05T20:55:52.603 に答える
2

面白い。私がこれまでに思いついた唯一の理由は、プロトタイプを書き直すのが好きで、このようにこのメソッドを「非表示」にすることで、バグを回避できる可能性があるからです。特に良いメソッド名のため、たとえば__defineGetter__.

多くの機能がこの機能 (リンク)に依存しているように思われるため、このコンテキストでよりグローバルで安全にすることは理にかなっています。

于 2012-11-05T20:53:14.197 に答える