What is this code doing?

Object.filter = function( obj, predicate) {
    var result = {}, key;


    for (key in obj) {
        if (obj.hasOwnProperty(key) && !predicate(obj[key]){ //really confused about the !predicate(obj[key]) part
            result[key] = obj[key];
        }
    }

    return result;
};