2011-11-09 9 views
2

私のコードにhasOwnPropertyをたくさん使用する必要があり、それは大変長く、キャメルケースには入力する必要があります。私はちょうどmyObj.has('x')と言うことができるようにしたかったが、Object.prototypeでhopのエイリアスを作成しようとしたときに、 'has'がfor..inループで列挙されるようになりました。私が望むものを得るための最良の方法は何ですか?私はちょうどhas(obj, prop)のように動作するグローバルな機能を作ることができることを意味するが、私はドットフォーマットがより好きであり、どのようなトリックJavaScriptがそれを持っている可能性があるか知りたいと思うので、私は提案を探している。hasOwnPropertyの名前を変更して列挙を防止します

更新:これはかなりハッキーですが、String.prototype.in = function(obj){return obj.hasOwnProperty(this)} OKですか?それで、私はif ('x'.in(myObj)) {...と言うことができます。残念ながら、hasOwnPropertyのエイリアシングではなく、別のレイヤーの関数呼び出しを追加しますが、構文が気に入っています。

答えて

3

あなたはenumera ES5互換性のあるブラウザでン、Object.defineProperty()使用:非可算のプロパティを設定するに

Object.defineProperty(myObj, "has", { value: Object.prototype.hasOwnProperty }); 

defineProperty()デフォルトを。より良いES3のアプローチは、単に機能エイリアスになりますとObject.prototypeに貼り付けないでください:

var has = function (ob, prop) { 
    return Object.prototype.hasOwnProperty.call(ob, prop); 
} 

私は将来的には多分潜在的な命名の衝突を除いて、いずれかの独自のString.prototype.inアプローチに何か問題が表示されていません、それはあなたの呼び出しです。それをString.prototype.onと呼ぶと、in演算子のあいまいさが取り除かれます。

+0

ありがとうございます。前にdefinePropertyを使ってみましたが、間違って使っていたと思います – Moss

1

これは

Object.prototype.has = function(x) { 
    return this.hasOwnProperty(x) 
} 

がSomeNativeThing.prototypeを使用する際には注意してくださいとObject.prototype.has = Object.prototype.hasOwnPropertyをされ使用して、あなたが@pomeh状態として何

をオーバーライドしていないことを確認するために

if ((typeof Object.prototype.has) !== 'function') { 
    ... 
} 

を使用するトリックを行う必要があります道順はより良い

+2

なぜ 'Object.prototype.has = Object.prototype.hasOwnProperty;'ではないのですか? – pomeh

+1

sidenote:Object.prototypeを拡張しないでください。 myObject.prototypeを代わりに拡張してください –

+0

@pomehあなたが正しいです、あなたのテクニックはより速くて安全です –

関連する問題