8

そこで、サンプルの JavaScript コードを次に示します。

Object.prototype.simpleFunction = function () {
    return true;
}
var tempObject = {};
for (var temp in tempObject) {
    console.log(temp);
}

console.logこれを実行すると、Google Chromeのコマンドから「simpleFunction」出力が得られることに注意してください。(私は 19.0.1084.46m を使用しています。)

ただし、関連する多種多様なオブジェクト関数は に渡されませんconsole.log

「オブジェクト」ループObjectに表示されずにプロトタイプに関数を追加するにはどうすればよいですか?for property in

編集:私が最後に望んでいたのは、そこに別の「if」ステートメントをスローすることであったことを言及する必要がありました。これは、すべてのforループに追加する必要があることを意味します。:(

4

4 に答える 4

14

そのため、常に確認する必要がありますhasOwnProperty

for (var temp in tempObject) {
    if (Object.prototype.hasOwnProperty(tempObject, temp)) {
        console.log(temp);
    }
}

Crockfordは、オブジェクトをオーバーライドする場合に備えて、Object.prototype.hasOwnPropertyの代わりにを使用することを推奨しています。tempObject.hasOwnPropertyhasOwnProperty


ES5では、次のように設定できませんenumerable

Object.defineProperty(Object.prototype, 'simpleFunction', {
    value: function() {
        return true;
    },
    enumerable: false, // this is actually the default
});

または(ES5では)、Object.keys()オブジェクト自体のキーのみを取得するために使用できます。

Object.keys(tempObject).forEach(function(key) {
    console.log(key);
});
于 2012-05-22T03:57:47.877 に答える
0

次のような意味ですか?

for (var temp in tempObject) {
    if (tempObject.hasOwnProperty(temp )) {
         console.log(temp);
    }
}
于 2012-05-22T03:57:48.773 に答える
0

これを行うことにより、継承されたプロパティをスキップできます。

if (tempObject.hasOwnProperty(temp)) {
    // property didn't come from the prototype chain
}

つまり、を使用して関数を反復処理しない限り、プロトタイプに関数を追加することはできませんin

常にオブジェクトを渡す外部インターフェースを定義できます。

function simpleFunction(obj) {
}
于 2012-05-22T03:58:47.350 に答える
0

これを JavaScript で行うことはできません。結果を自分でフィルタリングする必要があります。可能性のある方法の 1 つは、別のオブジェクトで独自のプロトタイプ プロパティを定義することです。

var myObjectExt = {
    sampleFunciton: function(){}
}
var p;
for(p in myObjectExt){
    Object.prototype[p] = myObjectExt[p];
}

var obj = {};
for(p in obj){
    if(myObjectExt[p])continue;
    //do what you need
}
于 2012-05-22T04:04:39.670 に答える