2016-05-31 2 views
4

저는 회사에서 JavaScript로 작동하는 전문가들과 이야기를 해왔습니다. 을 사용하지 않고 new을 사용하여 객체 인스턴스를 만드는 것이 좋지 않다고 들었습니다. 이 같은 빈 개체 :Object.create ({}) : 좋은 방법입니까?

var correct = Object.create({}); 

을의 프로토 타입으로 빈 객체를 전달 :

var wrong1 = new Object(); 
var wrong2 = {}; 

그러나 그들과 회사의 기준에 따라 가장 올바른 방법은이처럼 만드는 것입니다 빈 객체는 오히려 과도하게 설계된 것 같고, 아마도 무모한.

이 권장 사항에 대한 답변을 누군가가 나에게 줄 수 있습니까, 그렇지 않은 이유는 무엇입니까? (가능한 찬반 양론)

+5

그러나 지침에 따라 빈 객체 리터럴'{}'을 잘못 전달하지 않습니까? 'Object.create (Object.create ({}))'가 좋지 않습니까? ;) –

+0

[새 Object() \와 객체 리터럴 표기법의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/4597926/what-is-the-difference-between-new (오브젝트와 리터럴의 표기법) – Oleg

+3

@ el.pescado - 괜찮습니다. 그러나 이것은 매우 중요합니다 :'function create() {return Object.create (create())}' –

답변

6

개체 리터럴은 다음 프로토 타입 체인으로 개체를 만듭니다.

Object.prototype -> {} 

리터럴 구문은 일반적인 패턴이기 때문에 대부분의 엔진에서 많이 최적화됩니다.

비교하려면 Object.create({})은 더 긴 프로토 타입 체인으로 개체를 만듭니다.

(맨 오른쪽)
Object.prototype -> {} -> {} 

인스턴스는 이미 Object.prototype의 프로토 타입을하기 전에 본 {}의 프로토 타입을 가지고 있습니다.

Object.create은 사용자 정의 프로토 타입을 사용하여 개체를 만드는 데 매우 유용한 기능이며 new과 같은 문제가 발생하지 않습니다. 그러나 {}은 이미 프로토 타입 체인이 짧은 객체를 생성하기 때문에 이 필요합니다.

간접적 인 (그리고 성능 손실) 추가 레이어를 추가하는 것이 "모범 사례"라고 생각하는 이유를 모르겠습니다.

글자 그대로의 문법이 더 안전하다고 말하고 싶습니다. {}을 우연히/악의적으로 재정의 할 수있는 방법이 없기 때문에 그림자를 적용 할 수는 없습니다 (Object). 물론

var Object = 3; 
// ... 
Object.create({}) // TypeError: Object.create is not a function(...) 

, 이것은 당신이 Object를 사용해서는 안 의미하지 않는다, 그러나이 경우 나는 {}이 작업에 대한 간단한 도구입니다 결과적으로 너무 최상의 성능을 가지고 있다고 생각합니다.

+0

정말 좋은 지적이 있습니다. 'Object'는 음영 처리가 가능하며'.create' 함수도 사용할 수 있습니다. –

+1

내 생각 엔 누군가가 정말로 항문이되어서'Object.create()'가 존재한다면 ... 그러면 더 좋을 것 같아요. – charlietfl

+0

이 의견으로'var a = {}'가 짝수라고 가정 할 수 있습니다. 'var b = new Object()'보다 안전합니까? –

관련 문제