【问题标题】:Is There A Way To Clear an Object In Javascript?有没有办法在 Javascript 中清除对象?
【发布时间】:2023-03-08 23:36:02
【问题描述】:

有没有办法在 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 = [];
    }
}

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

【问题讨论】:

  • 用你想要的变量创建一个对象的实例......然后当你想“重置”它时......var thisObj = blankObj;
  • 不是内置的,没有。您可能想要编写一个递归遍历对象并执行您想要的操作的函数。
  • @xxcezz 这行得通,但存在引用问题;如果现有对象已在某处引用,则必须更新所有这些引用。
  • 然后创建一个全局 resetThisTypeOfObject() 函数并像@Qix 所说的那样做......但是添加到第三方库原型也不是那么困难
  • 隐藏在众目睽睽之下:exampleObject.call(theInstance);将对象的初始值返回到初始值。

标签: javascript


【解决方案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;
        }
    }
}

【讨论】:

  • 除了第一次调用它时会立即破坏所有实例上的任何原型方法......
  • 好收获;应该是var key in Object.getOwnPropertyNames(o),固定的。
  • 现在您正在迭代一个键数组并破坏 Array.prototype,这是不对的……您需要 for and if 和 if 中的 hasOwnProperty()。
  • 哎呀;是的。我一直在使用太多的 lodash;我对for(prop in obj) 语法的怪癖生疏了。现在应该修复了。
  • 好多了。这仍然会替换对象而不是清空它们,这可能重要也可能不重要。最好通过将长度设置为 0 来清除数组,并将对象设置为 Object.keys(o).forEach(function(){delete o[a]; })。它还破坏了日期和正则表达式,但如何更好地清除这些类型尚不清楚......
【解决方案2】:

如果您有自己的属性再次是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多