2013-05-23 1 views
1

ECMAScript 5에서 속성 속성을 정의하는 기본 방법은 무엇입니까?ECMAScript 5에서 속성을 구성하는 방법 : Object.create 또는 Object.defineProperties?

function Foo() { 
    Object.defineProperties(this, { 
    'a': { 
     value: "A", 
     writable: false 
    }, 
    'b': { 
     value: "B", 
     writable: true, 
     enumerable: true 
    } 
    }); 
} 

var f = new Foo(); 

또는 : 내가 이해에서, 적어도 두 가지 방법이 있습니다 newObject.create와 인스턴스의 장점 게다가

var Foo = Object.create({}, { 
    'a': { 
     value: "A", 
     writable: false 
    }, 
    'b': { 
     value: "B", 
     writable: true, 
     enumerable: true 
    } 
    }); 
}; 

var f = Object.create(Foo); 

Object.defineProperties()를 사용하여 속성을 정의에서 성능 히트로,이 첫 번째 예에서? 둘은 동등한가요? 가독성에 대한 합의가 있습니까?

+1

바로 사용 : 당신이 정말로 빈 대상이 아닌 뭔가 상속하려는 경우 그러나, 당신은 단지 Object.create을 사용해야합니다. –

+0

성능과 관련하여 구현 및 버전에 따라 다릅니다. 그것을 테스트하십시오. –

+2

당신의 생성자 예제는'f'에 속성을 넣는 반면,'Object.create' 예제에서는'f'가 속성을 상속합니다. –

답변

2

Object.defineProperties()

예를 사용하여 정의 특성의 성능 저하가 있습니다. 속성 설명자는 일반 속성으로 최적화되지 않으므로 속도가 훨씬 느립니다. 당신이 (사용해야 만한다면) 당신은 어쨌든 성능에 신경 쓰지 않습니다. Object.createnew으로 비교하는 것은 동작이 다르고 성능 차이가 미미하기 때문에 무의미합니다.

두 개의 동일한 항목입니까? 공통 Foo.prototype 없다 - Object.create({})과 같이

번호

// The first one, 
function Foo() { 
    Object.defineProperties(this, propertydescriptors); 
} 
f = new Foo; 
// is equivalent to 
function Foo() {} 
f = Object.defineProperties(new Foo, propertydescriptors); 
// as long as there is closure in the property descriptor 

// The second one, 
foo = Object.create({}, propertydescriptors); 
// is equivalent to 
foo = Object.defineProperties(Object.create({}), propertydescriptors); 

new Foo는 동일하지 않습니다. 또한, 두 번째 예제에서 당신도 이제 위에서 f = new Foo에서 확실히 다른

f = Object.create(foo); 

이 있습니다.

가독성에 대한 합의가 있습니까?

생성자의 속성 설명자는 매우 드문 경우입니다. 당신 만이 필요하면 더 짧고 더 간결한 Object.create 문법을 사용하지 않을 이유가 없습니다.

f = Object.create(fooproto, propertydescriptors); 

그렇지 않으면 합의가 결코

f = Object.defineProperties({}, propertydescriptors);