2014-03-26 3 views
3

그래서 __proto__에 대한 모든 언급에는 대개 Brendan Eich가 사용하지 말라는 내용이 나와 있습니다. 나는 Typescript에서 약간의 반성을 가지고 놀았으며, 클래스의 프로토 타입 체인을 사용하여 제공된 상위 클래스로 이동했으며 클래스 메타 데이터를 보유하는 단일 프로토 타입 속성을 주입하려고합니다.Typescript 및 __proto__ 속성 ​​

성능상의 오버 헤드에 대한 세부 사항이나 __proto__에 의존하지 않는 솔루션은 있습니까?

편집 - 코드로 업데이트. 이것은 필자가 입력 한 고의적 인 예일 뿐이지 만 내가 원하는 것을 보여줍니다. 나는 __proto__ 돌연변이로 인한 침체 된 속도 저하를 벤치마킹하는 방법을 잘 모르겠습니다. 그러나 어쨌든 나는 그것을 쐈다. 인스턴스화, 프로토 타입 속성 액세스 및 메서드 호출은 수정 사항을 제공 할 때마다 다르게 실행됩니다.

class Base { 
    public getClassName() : string { 
     return this['_className'] || undefined; 
    } 
} 

class Intermediate extends Base { 
} 

class Final extends Intermediate { 
} 

function traverseProtoChain(derivedClass, baseClass) { 
    var cursor = derivedClass.prototype; 
    while (cursor instanceof baseClass) { 
     if (isDefined(cursor.constructor)) { 
      var className = getProtoName(cursor); 
      if (isValidString(className)) 
       cursor['_className'] = getProtoName(cursor); 
     }   

     if (isDefined(cursor.__proto__)) { 
      cursor = cursor.__proto__; 
     } 
    } 
} 
+0

당신이 생각한 코드를 보여주세요 – basarat

답변

5

당신은 ECMAScript를 5.1 표준 사용할 수 있습니다 : 브라우저의 정말 아주 오래된 버전의

Object.getPrototypeOf(cursor) 

를, 존재하지 않는 __proto__Object.getPrototypeOf 경우 다시 떨어질 시도 할 수 있지만,이 경우를 결정할 수 있습니다 이러한 브라우저는 특정 상황에서 중요합니다.

다음은이를 보여주는 예입니다. bar.prototype은 인스턴스이기 때문에 작동하지 않습니다. getPrototypeOf이 효과가 있으며 낙담 한 응답 인 __proto__을 제공합니다.

class Foo { 
    constructor(name: string) { 

    } 
} 

class Bar extends Foo { 

} 

var bar = new Bar('x'); 

console.log(bar.prototype); 
console.log(Object.getPrototypeOf(bar)); 
console.log(bar.__proto__); 

그래서 당신은 ... (가) "모든 사람을 기쁘게"쓸 수

if (Object.getPrototypeOf) { 
    console.log(Object.getPrototypeOf(bar)); 
} else if (bar.__proto__) { 
    console.log(bar.__proto__); 
} 

최종 커브 볼 ... __proto__ 염두에 가치 베어링 ... ECMAScript를 6에서 표준화가 될 가능성이 높습니다!

+0

자세한 게시물 주셔서 감사합니다. 필자는 getPrototypeOf를 인식하고 있으며 내 라이브러리에 polyfill을 구현했습니다. 성능에 어떤 영향을 주는지에 대한 정보를 찾고있었습니다. Brendan Eich는 현대 JS 구현을 고려할 때 __proto__ 변이가 성능에 부정적인 영향을 줄 수 있다고 말했습니다. – Frostie

+0

대답은 항상 그것을 측정하고 그것이 실제로 있는지 확인하는 것입니다. – Fenton

관련 문제