0

私は興味深い状況に陥った。オブジェクト リテラルを使用して、実世界の製品を表現しています。現在、各製品には、配送目的で関連付けられた長さが設定されています。次のようになります。

var product = {
  name: 'MacBook Pro 15 Inch',
  description: 'The new macbook pros....',
  length: 15
  height: 15
  Weight: 4
}

これはこれでうまくいきます。ただし、長さが不明な製品の場合、デフォルトの長さは -1 です。

あなたがこれをしようとするまで、これはうまくいきます:

console.log('Product has the following properties');
_.each(product, function(val, key) {
    console.log(key + ":" + val);
});

長さ の製品のキーは印刷されません-1。なんで?アンダースコアは内部的に長さ属性を使用するため、Javascript のすべてのオブジェクトは、渡されたオブジェクトのすべての属性をループする必要があります。その値を上書きしたため、現在-1は であり、 でループを開始してi = 0いるため、ループは実行されません。

質問ですが、長さプロパティがオーバーライドされないようにするにはどうすればよいですか? これが起こらないようにするためのベストプラクティスも高く評価されます。

4

4 に答える 4

1

これを試して:

    var product = {
        name: "MacBook Pro 15 Inch",
        description: 'The new macbook pros....',
        length: 15,
        height: 15,
        weight: 4
    };
    console.log('Product has the following properties');
    _.each(_.keys(product), function(key){
        console.log(key + ":" + product[key]);
    });
于 2012-07-10T23:49:31.817 に答える
1

これはおそらく、 s とs の両方を受け入れると思われる .. の関数_の魔法によるものです..独自のものを作成しますか?eachObjectArray

簡単な実装 (いくつかの一般的な落とし穴を回避します):

function each(obj, map_func) {
    var key;
    for (key in obj) {
        if (Object.prototype.hasOwnerProperty.call(obj, key)) {
            map_func(key, obj[key]);
        }
    }
}

_の魔法eachはおそらく、魔法の変数のように、配列のように「見える」が実際には配列ではないという JavaScript の厄介な「習慣」によるものであり、選択した DOM 要素でも同様argumentsだと思います。options

于 2012-07-10T23:45:14.950 に答える
1

それをオーバーライドするオフハンドは考えられません。length プロパティの使用は、jQuery によって iterable としてマークされるダック タイピングの一種だと思います。

しかし.. jQueryの各メソッドを使用することはできず、手動で行うことができます..

単純に使うことで

for (key in product) { 


}

基本的なループを取得します。オブジェクトのプロトタイプをオーバーライドする可能性がある場合は、product.hashOwnProperty(key) もチェックして、反復している現在のキーが製品インスタンスで定義されていることを確認する必要があります。

新しいクロージャースコープも必要な場合は、それも非常に簡単です..ここに各関数の代替があります..

var myEach = function(subject, callback) {

  for (key in subject) {

     if (subject.hasOwnProperty(key)) {
        callback(subject[key], key);
     }
  }

}

注: 未テスト。

于 2012-07-10T23:47:30.357 に答える