有没有办法在Javascript中清除对象?

时间:2014-06-06 20:06:38

标签: javascript

有没有办法在Javascript中清除对象?具体来说,如果一个对象有多个成员变量,有一种简单的方法可以重置每个值吗?

function exampleObject() {
    this.valueA = "A"; 
    this.valueB = "B"; 
    this.myArray = [1,2,3];
}

所以基本上对于上面的一个实例重置三个成员来清空字符串和一个空数组?我可以轻松地为对象原型化一个成员函数来执行此操作并调用它:

function exampleObject() {
    this.valueA = "A"; 
    this.valueB = "B"; 
    this.myArray = [1,2,3];
    exampleObject.prototype.resetAll = function() {
        this.valueA = ""; 
        this.valueB = ""; 
        this.myArray = [];
    }
}

但是我想对来自第三方库的对象执行此操作,因此添加成员函数并不现实。

2 个答案:

答案 0 :(得分:1)

这取决于你的意思"重置"。如果要根据属性类型将所有属性清除为某个默认值,可以执行以下操作:

function resetObject(o) {
    for(var key in o) {
        if(!o.hasOwnProperty(key)) continue;
        var val = o[key];
        switch(typeof val) {
            case "string":
                o[key] = ""; break;
            case "number":
                o[key] = 0; break;
            case "boolean":
                o[key] = false; break;
            case "object":
                if(val === null) break;
                if(val instanceof Array) {
                    o[key] = []; break;
                }
                val = {}; 
                //Or recursively clear the sub-object
                //resetObject(val);
                break;
        }
    }
}

答案 1 :(得分:0)

如果您拥有属于 Objects (或 functions )的属性,可能需要稍微调整一下,但您可以做类似的事情。

var resetMyObject = (function (Constr) {
    var defaults = new Constr();
    function has(o, k) {
        return Object.prototype.hasOwnProperty.call(o, k);
    }
    return function resetFunction(obj) {
        var k;
        for (k in obj) { // might want to iterate over ownPropertyNames instead
            if (has(obj, k)) {
                if (has(defaults, k)) {
                    obj[k] = defaults[k];
                } else {
                    delete obj[k];
                }
            }
        }
        return obj;
    };
}(MyObject)); // pass in the constructor to generate the function

resetMyObject(instanceOfMyObject);

例如,使用MyObject = Array

resetMyObject([1, 2, 3]); // [undefined × 3] (length non-enumerable property)