JavaScript-是否要删除对象的所有基本方法和属性,但保留一个?

JavaScript-是否要删除对象的所有基本方法和属性,但保留一个?,javascript,Javascript,我正在构建一个应用程序来扫描DOM中的元素及其子元素。现在,我可以通过以下代码行获得所需的数据: var bodyObj = document.getElementsByTagName("BODY")[0].children; 问题是,bodyObj对象中充斥着不必要的方法和属性,我只想保留children方法并清理其余的。有没有办法做到这一点 PS 纯Js。您可以这样做: for (var key in bodyObj){ if (bodyObj.hasOwnProperty(key

我正在构建一个应用程序来扫描DOM中的元素及其子元素。现在,我可以通过以下代码行获得所需的数据:

var bodyObj = document.getElementsByTagName("BODY")[0].children;
问题是,
bodyObj
对象中充斥着不必要的方法和属性,我只想保留
children
方法并清理其余的。有没有办法做到这一点

PS
纯Js。

您可以这样做:

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}

您可以这样做:

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}
仅具有
子属性的Body对象
您可能会想尝试以下方法:

var bodyObj = document.getElementsByTagName("BODY")[0];

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}
delete bodyObj.baseURI;
console.log(bodyObj.baseURI);
…就像弗洛里安·卡比罗在书中建议的那样。但是,
对象的属性是不可枚举的,这意味着它们不会显示在循环中。要获取不可枚举属性,可以尝试(在ES5+中):

但它仍然无法得到它们。接下来,您可能会想,“我将创建一个包含
HTMLBodyElement
s中所有可能的属性/方法名称的数组,并循环遍历它们,如果它们存在,则将其删除。”但是,如果您执行以下操作:

var bodyObj = document.getElementsByTagName("BODY")[0];

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}
delete bodyObj.baseURI;
console.log(bodyObj.baseURI);
您会注意到它没有删除它。这是因为您无法从DOM对象中删除属性。重新定义它们或删除它们的尝试将以静默方式失败

身体对象的
子对象
HTMLElement
s 要获取不带任何属性/方法的
document.getElementsByTagName(“BODY”)[0].children
,可以执行以下操作:

var bodyObj = document.getElementsByTagName("BODY")[0].children;

bodyObj = Object.keys(bodyObj).map(function(key) { return bodyObj[key]; });
这将把它从
HTMLCollection
转换为数组,如果您同意的话。您可以始终将其包装在一个对象中:
bodyObj={children:bodyObj}

仅具有
子对象的Body对象
属性 您可能会想尝试以下方法:

var bodyObj = document.getElementsByTagName("BODY")[0];

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}
delete bodyObj.baseURI;
console.log(bodyObj.baseURI);
…就像弗洛里安·卡比罗在书中建议的那样。但是,
对象的属性是不可枚举的,这意味着它们不会显示在循环中。要获取不可枚举属性,可以尝试(在ES5+中):

但它仍然无法得到它们。接下来,您可能会想,“我将创建一个包含
HTMLBodyElement
s中所有可能的属性/方法名称的数组,并循环遍历它们,如果它们存在,则将其删除。”但是,如果您执行以下操作:

var bodyObj = document.getElementsByTagName("BODY")[0];

for (var key in bodyObj){
    if (bodyObj.hasOwnProperty(key) && key != 'children'){
        delete bodyObj[key];
    }
}
delete bodyObj.baseURI;
console.log(bodyObj.baseURI);
您会注意到它没有删除它。这是因为您无法从DOM对象中删除属性。重新定义它们或删除它们的尝试将以静默方式失败

身体对象的
子对象
HTMLElement
s 要获取不带任何属性/方法的
document.getElementsByTagName(“BODY”)[0].children
,可以执行以下操作:

var bodyObj = document.getElementsByTagName("BODY")[0].children;

bodyObj = Object.keys(bodyObj).map(function(key) { return bodyObj[key]; });

这将把它从
HTMLCollection
转换为数组,如果您同意的话。您可以始终将其包装在一个对象中:
bodyObj={children:bodyObj}

“扫描DOM中的元素及其子元素”,您看过了吗?另外,
children
不是一个方法,它只是子节点元素的集合。如果您不需要所有的DOM方法/属性,那么只需从元素中获取所需的数据并将其存储在其他位置即可。您可以提供更多信息吗?到底是什么困扰着您?DOM元素拥有他们拥有的API。如果您只关心他们的一部分数据,请按照Evans的建议将其提取到另一个对象中。在DOM元素中添加或删除属性不是一个好主意。我正在构建一个脚本来“可视化”DOM,因此我需要跟踪所有元素及其子元素(可能还有它们的子元素等等)。我想把它作为一个对象保留下来,因为可以有很多级别的子元素,所以数组将更难维护。为什么不直接使用DOM元素呢?它已经是一个对象,并且具有最精确的表示,因为它本身就是DOM元素。我不认为预处理数据有什么好处。“扫描DOM中的元素及其子元素”,你看过吗?另外,
children
不是一个方法,它只是子节点元素的集合。如果您不需要所有的DOM方法/属性,那么只需从元素中获取所需的数据并将其存储在其他位置即可。您可以提供更多信息吗?到底是什么困扰着您?DOM元素拥有他们拥有的API。如果您只关心他们的一部分数据,请按照Evans的建议将其提取到另一个对象中。在DOM元素中添加或删除属性不是一个好主意。我正在构建一个脚本来“可视化”DOM,因此我需要跟踪所有元素及其子元素(可能还有它们的子元素等等)。我想把它作为一个对象保留下来,因为可以有很多级别的子元素,所以数组将更难维护。为什么不直接使用DOM元素呢?它已经是一个对象,并且具有最精确的表示,因为它本身就是DOM元素。我不认为预处理数据有什么好处。