递归地检查原型上的属性,如果存在则从原型中删除
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);
}
}
}
}
这里并不需要递归——一个简单的while循环就足够了。
function deleteProp(obj, prop) {
while (obj && obj !== Object.prototype) {
delete obj[prop];
obj = Object.getPrototypeOf(obj);
}
}
检查obj
是必要的,因为对象可能没有原型,例如,如果它是用Object.create(null)
创建的。
从输出来看,这应该是您想要的。
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);
Edit:这能行吗?
相关文章:
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 使用“;这个“;JavaScript原型方法中的关键字
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 引用类变量中的原型方法
- 如何从对象的原型方法访问JavaScript对象属性
- 用于检查数组中是否存在元素的javascript自定义方法
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- Node.js中的JavaScript原型对象效率
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 正在将事件处理程序添加到不存在的类
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 原型JavaScript Event.observe-如何观察可能存在或不存在的元素
- 是否存在替换Javascript构造函数的问题'原型,而不是添加到原型中
- 在javascript中覆盖原型时,对象以两种状态存在
- 递归地检查原型上的属性,如果存在则从原型中删除
- 是否存在私有/受保护的原型继承模式?
- 如何正确地创建Javascript原型,使类变量不会在实例化之间持久存在
- 针对不同上下文的原型的IE9中的JavaScript存在错误