2012-07-01 5 views
7

은 분명히 __proto__ 속성을 사용하는 것은이 표준을 준수하지 않고 IE를 지원하지 않는 경우에도, 여전히 프로토 타입 체인을 조작하는 주요 방법입니다. 당신은 또한 new 생성자를 사용하여 상속을 구성 할 수 있지만이 __proto__ 속성 또는 표준을 준수 Object.getPrototypeOf 기능에 비해 불필요한 합병증처럼 보인다.ECMAScript 표준에 Object.setPrototypeOf (...)가없는 이유는 무엇입니까?

편집 : 답변에 명시된 바와 같이

,이 방법은 지금 (ES6 표준) 존재한다. 하지만, 성능 경고에 유의하십시오 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf

+5

좋은 소식. Object.setPrototypeOf()가 ES6에 들어간 것 같습니다. http://webreflection.blogspot.pt/2013/05/objectsetprototypeofo-proto-is-in-es6.html – banzomaikaka

답변

7

그것은 ES6 조화 초안의 일부입니다.

var proto = { 
    foo: 'bar' 
}; 

var object = {}; 

Object.setPrototypeOf(object, proto); 

console.assert(object.foo == 'bar'); 
2

Brendan Eichhere 말한다 :

Object.setPrototypeOf이 일어날 수 없습니다. 쓰기 가능 __proto__는 (주기 검사로 직렬화한다)를 구현하는 거대한 고통이며 형식 혼란의 위험 모든 종류를 생성합니다. 당신은 그것이 저급 예리한 도구 로 원한다고 생각할 수 있습니다. JS는 그 언어가 아닙니다. 클래스와 mixins에 대한 더 높은 수준의 양식이 훨씬 더 좋게 보이며 가장자리가 날카로운 모서리를 포함하지 않습니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf

내가 크롬의 최신 릴리스에서 지금 사용하고 있습니다 :

+0

답변을 주셔서 감사합니다.하지만 제가 인정하지 않아도됩니다. 그것을 완전히 이해하십시오. 당신의 아이디어는 Javascript에서 프로토 타입 기반이 아닌 상속을 추가하는 것입니다. 내 마음에 Object.setPrototypeOf 단순히 프로토 타입 개체 참조를 만들 것이므로 직렬화가 필요한 방법을 이해하지 못합니다. 그는 잘못 :) 가 크롬에있어 그냥 처럼 – JussiR

+6

이 보인다 : https://code.google.com/p/v8/source/detail?r=18685 하고, 이미 파이어 폭스에서 실험의 : HTTPS : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf – lucasarruda

+0

@Esailija 2017 년에 이것에 대한 의견이 어떻습니까? 퍼포먼스와 최적화 (글 쓰는/쓰는 라이브러리에서)가 "심각하다"는 것 같아서, 당신이 생각하는 것을 알고 싶습니다. –