2012-02-09 5 views
6

그래서 빈 개체 a = {}이 있습니다. 내가 console.log(a), console.dir(a), 또는개체의 모든 숨겨진 속성 인쇄

for(b in a) { 
    console.log(b); 
} 

을 할 때 나는 같은 __defineGetter__, hasOwnProperty을의 "숨겨진 속성"을 참조하지 않는 등

나는 개체의 모든 속성을 인쇄 할 수있는 방법 ?

+0

당신은 어떤 브라우저를 사용 했 그래서 당신은 그들을 얻을 수 있을까? Google 크롬에서 객체의 모든 속성을 볼 수 있습니다. – antyrat

+0

@antyrat Google 크롬 17을 사용하고 있으며 console.log를 사용하는 유일한 속성은'__proto__'입니다. – Randomblue

+0

당신은이 속성을 열 수 있으며 그 안에는 열거되지 않는 모든 속성이 보일 것입니다. – antyrat

답변

12

오브젝트의 속성 (및 아마도 프로토 타입에서 상속 한 속성)은 non-enumerable입니다. 나는 자바 스크립트를 통해 그들을 얻는 표준 방법이 있다고 생각하지 않는다.

디버거를 사용하고 개체를 검사하는 경우 일반적으로 개체의 모든 속성이 표시됩니다 (열거 가능한 속성뿐 아니라). 모든 주요 브라우저에는 현재 디버거가 내장되어 있습니다. Chrome에는 Dev Tools (Ctrl + Shift + I)가 있습니다. IE8 이상에는 "F12 개발자 도구"가 있습니다. IE7 및 이전 버전은 무료 버전의 VS.Net을 통해 디버깅 할 수 있습니다. 최신 버전의 Firefox에는 도구가 내장되어 있습니다. 이전 버전에서는 Firebug 플러그인을 사용할 수 있습니다. Opera에는 잠자리가 있습니다.

업데이트 : 당신이 말한 질문에 대한 코멘트에 : 나는 구글 크롬 17 내가 console.log를 사용하여 볼 수있는 유일한 속성을 사용하고

__proto__입니다.

오른쪽. {}에는 전혀 특성이 없습니다. 단지 프로토 타입입니다. 왼쪽의 작은 화살표를 클릭하면 __proto__, __proto__의 속성을 볼 수 있습니다. hasOwnProperty, toString 등은 모두 {}이 프로토 타입 (즉 Object.prototype)에서 가져 오는 속성이며 객체 자체의 속성은 아닙니다.

JavaScript는 프로토 타입 상속을 사용합니다. 이는 객체가 프로토 타입으로 뒷받침됨을 의미합니다. 객체에없는 속성 값을 검색하려고하면 JavaScript 엔진은 객체의 프로토 타입을보고 프로토 타입에 해당 속성이 있는지 확인합니다. 그렇다면 그 값이 사용됩니다. 프로토 타입에 엔진이 없으면 엔진은 프로토 타입의 프로토 타입을 봅니다. 계층 구조의 루트에 도달 할 때까지 계속됩니다. 따라서 자신의 속성 대 속성을 상속받은 개체에 대해 듣는 것입니다.

다음은 생성자 함수입니다. new Foo을 사용하여 객체를 만드는 경우 자바 스크립트 엔진이 할당 할 프로토 타입에 속성을 배치합니다. 아직

var f = new Foo(); 

f는 전혀 성질이 없으며, :

function Foo() { 
} 
Foo.prototype.bar = 42; 

은의 그 생성자를 사용하여 객체를 만들어 보자

console.log(f.bar); // 42 

을 ...왜냐하면 f에는 "bar"라는 속성이 없기 때문에 엔진은 의 프로토 타입 인 Foo.prototype 개체를 찾습니다. 이제 f의 "바"속성을 제거 할 수

f.bar = 67; 
console.log(f.bar); // 67 

: : 이제

의이 f을주고 자신의 "바"속성을하자

delete f.bar; 
우리는 검색하려고하면 무슨 일이 일어날 지

f.bar 지금? 당신이 42 말했다 경우

console.log(f.bar); 

, 당신은 최고 점수를 얻을. f에는 더 이상 "bar"라는 속성이 없기 때문에 프로토 타입에서 가져 오는 것으로 돌아갑니다. 인 ECMAScript의 제 3 판에서

Foo.prototype.bar = 96; 
console.log(f.bar); // 96 

(대부분의 브라우저가 제 3 판의 라인을 따라 뭔가를 구현)에 프로토 타입을 할당 할 수있는 유일한 방법이 관계가 있으므로, 라이브 것을

주 객체는 위와 같이 생성자 함수의 prototype 속성을 통해 전달됩니다. 5 판으로, 더 직접적인 방법이 추가되었습니다 Object.create를, 당신이 직접 프로토 타입 객체를 통과 할 수있는 :

var proto = {bar: 42}; 
var obj = Object.create(proto); 
console.log(obj.bar); // 42 
proto.bar = 67; 
console.log(obj.bar); // 67 
+0

잘 작성되어 있습니다. (+1), thanks :) – nkm

3

Object.getOwnPropertyNames (OBJ)는 모든 비 열거 속성을 보여줍니다, 그것은 비록 prototype chain 조회를 따르지 않으므로 .과 같습니다.

나는 프로토 타입 체인을 올라가고 비 - 열거 형을 보여주는 방법을 모른다.

예 :

  • Object.keys()

    체인을하지 않으며,
  • for in 체인을 간다지만 표시되지 않는 비 enumerables
  • 을 표시하지 않습니다
    var o = Object.create({base:0}) 
    Object.defineProperty(o, 'yes', {enumerable: true}) 
    Object.defineProperty(o, 'not', {enumerable: false}) 
    
    console.log(Object.getOwnPropertyNames(o)) 
    // [ 'yes', 'not' ] 
    
    console.log(Object.keys(o)) 
    // [ 'not' ] 
    
    for (var x in o) 
        console.log(x) 
    // yes, base 
    

    그래서 우리는 결론 비 열거 형

물론 프로토 타입 체인을 수동으로 올라가서 Object.getOwnPropertyNames을 사용하십시오. Object, __defineGetter__hasOwnProperty의 경우에 대해

Object.prototype의 특성은 원형 사슬 룩업 통해 new Object 개체에서 발견된다.

console.log(Object.getOwnPropertyNames(Object.prototype)) 

는 출력 :

[ 'constructor', 
    'toString', 
    'toLocaleString', 
    'valueOf', 
    'hasOwnProperty', 
    'isPrototypeOf', 
    'propertyIsEnumerable', 
    '__defineGetter__', 
    '__lookupGetter__', 
    '__defineSetter__', 
    '__lookupSetter__' ] 
관련 문제