递归检查原型上的 属性 并从原型中删除它(如果存在)

Recursively check for property on prototype and delete it from prototype if it exists

我正在尝试编写代码来删除对象中的 属性。如果它被继承,它必须上链并从祖先中删除它。 到目前为止,我已经想出了这个(不起作用):

// My objects:
   var pro = {'a':1};
    var pro2 = Object.create(pro);
    var pro3 = Object.create(pro2);

// -------------------------------------- ----------

    function deleteProp(obj, prop){
        console.log(obj,prop)
        //get own properties
        var ownprop = Object.getOwnPropertyNames(obj);


        for(var i=0 ;i <ownprop.length; i++){
            if (prop === ownprop[i]){
                delete obj.ownprop[i];
            }
            else{ 

           //get the parent
                var parent = Object.getPrototypeOf(obj);
                console.log(parent);
                while (Object.getPrototypeOf(parent)!== Object.prototype){

             //recursive call
                    deleteProp(parent, prop);
                }
            }
        }
    }

从输出来看,这应该可以满足您的要求。

var pro = {'a':1};
var pro2 = Object.create(pro);
var pro3 = Object.create(pro2);

function deleteProp(obj, prop) {
  do {
    delete obj[prop];
  }
  while ((obj = Object.getPrototypeOf(obj)));
}

console.log('before', pro.a, pro2.a, pro3.a);
deleteProp(pro3, 'a');
console.log('after', pro.a, pro2.a, pro3.a);

编辑:这样可以吗?

这里你真的不需要递归——一个简单的 while 循环就足够了。

function deleteProp(obj, prop) {
  while (obj && obj !== Object.prototype) {
    delete obj[prop];
    obj = Object.getPrototypeOf(obj);
  }
}

检查 obj 是必要的,因为一个对象可能没有原型,例如,如果它是用 Object.create(null) 创建的。