2013-11-20 1 views
0

(분명히 나는이 제목이 무엇인지 잘 모르겠다.)프로퍼티 중 하나에 속하는 함수를 호출하는 객체를 가져 오거나 프로토 타입을 명명합니다.

최소한의 위험으로 원시 객체의 프로토 타입을 수정할 수 있기를 바란다. 다시 그것은 필사적 인 자바 스크립트 죄입니다).

생각이 바뀌 었습니다. 사용자 정의 함수를 원형에 직접 추가하는 대신 프로토 타입의 단일 객체에 추가 할 수 있다면 충돌 가능성을 크게 줄일 수 있습니다.

String.prototype.foo = function() { 
    //do stuff 
}; 

나는 코드가있는 경우

, ... 분명히 키워드 this 참조 호출 한 문자열입니다. 그러나, 나는 무엇인가 등을 할 경우

String.prototype.foo = {}; 

String.prototype.foo.bar = function() { 
    //do stuff 
}; 

... 키워드 this 참조 객체 foo.

이것을 극복 할 방법이 있다면?

+0

그레이엄이 옳은 이유를 알고 싶다면 http://stackoverflow.com/a/16063711/1641941 (답변의 마지막 부분)에서 'this'값에 대해 읽을 수 있습니다. – HMR

답변

1

call를 사용하여 컨텍스트를 무시하는 것이다이를 극복 할 수있는 유일한 방법 : 작동하지만, 꽤 말도

String.prototype.foo.bar.call('hello')) 

.

네이티브 프로토 타입을 수정하는 것을 피하고 대신 메서드로 문자열을 매개 변수로 허용하는 것이 좋습니다.

0

글쎄, 얼마나 많은 작업을 넣고 싶은지에 따라 몇 가지 방법이 있습니다. 바인드를 사용하는 것이 가장 간단한 방법이지만 문자열을 변수로 정의해야만 그 기준은 바인딩 :

String.prototype.foo = function() { console.log(this); } 
String.prototype.foo.bar = function() { console.log(this); } 

var g = "hi there"; 
g.foo() // Yields g 

g.foo.bar() // Yields String.prototype.foo() 
g.foo.bar.bind(g)() // Yields g again. 
String.prototype.foo.bar 반환하는 기능을 활성화하도록

가 String.prototype.foo에 게터와 세터를 생성하여 원하는 결과를 생성하는 또 다른 매우 hackish 방법이있을 수있다 foo가 참조하는 인스턴스에 바인드 된 함수. ??? 혼란스러워.

충돌의 가능성을 줄이기위한 최선의 방법은 프로토 타입 상속을 활용하고 고유 문자열의 고유 한 서브 프로토 타입을 만드는 것입니다.

function MyString(string) { 

    this.foo = function() { //whatever }; 

    this.foo.bar = (function() {}).bind(this); 

    this.toString = function() { return string; } // because toString is not generic. 
} 

MyString.prototype = new String(); 

여기서는 String 프로토 타입의 "하위 프로토 타입"을 만듭니다. String 프로토 타입의 모든 속성을 상속하고 고유 문자열을 전혀 변경하지 않고 자체 프로토 타입을 추가합니다. BONUS : this.foo와 this.foo.bar는 둘 다 인스턴스를 나타냅니다.

var instance = new MyString("hi"); 
instance.foo();  // this == instance 
instance.foo.bar(); // this == instance 
instance.replace("i", "e"); // returns "he" 

아마도이 답변은 당신이 찾고있는 답변이 아니었지만 적어도 도움이 될 것입니다.