递归检查原型上的 属性 并从原型中删除它(如果存在)
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)
创建的。
我正在尝试编写代码来删除对象中的 属性。如果它被继承,它必须上链并从祖先中删除它。 到目前为止,我已经想出了这个(不起作用):
// 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)
创建的。