Object.getOwnPropertyNames()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Object.getOwnPropertyNames() éææ¹æ³è¿åä¸ä¸ªæ°ç»ï¼å
¶å
å«ç»å®å¯¹è±¡ä¸ææèªæå±æ§ï¼å
æ¬ä¸å¯æä¸¾å±æ§ï¼ä½ä¸å
æ¬ä½¿ç¨ symbol å¼ä½ä¸ºåç§°ç屿§ï¼ã
å°è¯ä¸ä¸
const object1 = {
a: 1,
b: 2,
c: 3,
};
console.log(Object.getOwnPropertyNames(object1));
// Expected output: Array ["a", "b", "c"]
è¯æ³
Object.getOwnPropertyNames(obj)
åæ°
obj-
ä¸ä¸ªå¯¹è±¡ï¼å ¶èªæç坿䏾åä¸å¯æä¸¾å±æ§çå称被è¿åã
è¿åå¼
å¨ç»å®å¯¹è±¡ä¸æ¾å°çèªæå±æ§å¯¹åºçå符串æ°ç»ã
æè¿°
Object.getOwnPropertyNames() è¿åä¸ä¸ªæ°ç»ï¼å
¶å
ç´ æ¯ä¸ç»å®å¯¹è±¡ obj ç´æ¥å
³èç坿䏾åä¸å¯æä¸¾å±æ§å¯¹åºçåç¬¦ä¸²ãæ°ç»ä¸å¯æä¸¾å±æ§ç顺åºä¸ä½¿ç¨ for...in 循ç¯ï¼æ Object.keys()ï¼éåå¯¹è±¡å±æ§æ¶ææ´é²ç顺åºä¸è´ã对象çéè´æ´æ°é®ï¼å
æ¬å¯æä¸¾åä¸å¯æä¸¾çï¼é¦å
æååºæ·»å å°æ°ç»ä¸ï¼ç¶åæ¯ææå
¥é¡ºåºæåçå符串é®ã
å¨ ES5 ä¸ï¼å¦æè¯¥æ¹æ³ç忰䏿¯ä¸ä¸ªå¯¹è±¡ï¼èæ¯åºæ¬ç±»åå¼ï¼ï¼åä¼å¯¼è´ TypeErrorãå¨ ES2015 ä¸ï¼éå¯¹è±¡åæ°ä¼è¢«å¼ºå¶è½¬æ¢ä¸ºå¯¹è±¡ã
Object.getOwnPropertyNames("foo");
// TypeError: "foo" is not an object (ES5 code)
Object.getOwnPropertyNames("foo");
// ["0", "1", "2", "length"] (ES2015 code)
示ä¾
>ä½¿ç¨ Object.getOwnPropertyNames()
const arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort());
// ["0", "1", "2", "length"]
// ç±»æ°ç»å¯¹è±¡
const obj = { 0: "a", 1: "b", 2: "c" };
console.log(Object.getOwnPropertyNames(obj).sort());
// ["0", "1", "2"]
Object.getOwnPropertyNames(obj).forEach((val, idx, array) => {
console.log(`${val} -> ${obj[val]}`);
});
// 0 -> a
// 1 -> b
// 2 -> c
// ä¸å¯æä¸¾å±æ§
const myObj = Object.create(
{},
{
getFoo: {
value() {
return this.foo;
},
enumerable: false,
},
},
);
myObj.foo = 1;
console.log(Object.getOwnPropertyNames(myObj).sort()); // ["foo", "getFoo"]
å¦æä½ åªæ³è·å坿䏾屿§ï¼è¯·åè§ Object.keys() æä½¿ç¨ for...in 循ç¯ï¼è¯·æ³¨æï¼è¿ä¹å°è¿å对象ååé¾ä¸æ¾å°ç坿䏾屿§ï¼é¤éä½¿ç¨ hasOwn() è¿æ»¤ï¼ã
ååé¾ä¸ç屿§ä¸ä¼è¢«ååºï¼
function ParentClass() {}
ParentClass.prototype.inheritedMethod = function () {};
function ChildClass() {
this.prop = 5;
this.method = function () {};
}
ChildClass.prototype = new ParentClass();
ChildClass.prototype.prototypeMethod = function () {};
console.log(Object.getOwnPropertyNames(new ChildClass()));
// ["prop", "method"]
åªè·åä¸å¯æä¸¾ç屿§
è¿ä¸ªæ¹æ³ä½¿ç¨ Array.prototype.filter() 彿°ä»ææé®ï¼ä½¿ç¨ Object.getOwnPropertyNames() è·å¾ï¼çå表ä¸è¿æ»¤å¯æä¸¾é®ï¼ä½¿ç¨ Object.keys() è·å¾ï¼ï¼ä»èä»
以ä¸å¯æä¸¾é®ä½ä¸ºè¾åºã
const target = myObject;
const enumAndNonenum = Object.getOwnPropertyNames(target);
const enumOnly = new Set(Object.keys(target));
const nonenumOnly = enumAndNonenum.filter((key) => !enumOnly.has(key));
console.log(nonenumOnly);
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.getownpropertynames> |