2012-11-05 4 views
2

다른 함수에서 함수를 만드는 것과 관련된 프로젝트를 진행하고 있습니다. 나는 물건을 단순화하기 위해 클래스를 작성하는 아이디어가 있었지만, __proto__을 사용하지 않고 작동시키지 못했습니다.사용자 지정 함수 클래스

기본적으로 내 비전은 무엇입니까?

function MyFunction() { 
    // ... 
} 
var myFn = new MyFunction(); 
myFn(); // executes without error 
myFn instanceof MyFunction; // returns true 

다음 코드 뭔가 다른 모든 속성을 포함하는 기능을 확장있어 여기 __proto__

function MyFunction() { 
    var fn = function() { return 'hello'; }; 
    fn.__proto__ = this; 
    return fn; 
} 
var myFn = new MyFunction(); 
alert(myFn()); // hello 
alert(myFn instanceof MyFunction); // true 

를 사용하여 여기에 내가 valueOf

function MyFunction() { 
    this.fn = function() { return 'hello'; }; 
    this.valueOf = function() { return this.fn; }; 
} 
var myFn = new MyFunction(); 
alert(myFn instanceof MyFunction); // true 
alert(myFn.valueOf()()); // hello 
alert(myFn()); // error 

를 사용하려고했습니다 뭔가 그냥 않으며, MyFunction.

function MyFunction() { 
    this.foo = 'hello' 
    var fn = function() { return 'hello'; }; 
    for (var i in this) { 
     fn[ i ] = this[ i ]; 
    } 
    return fn; 
} 
var myFn = new MyFunction(); 
alert(myFn()); // hello 
alert(myFn.foo); // hello 
alert(myFn instanceof MyFunction); // false 

비표준이므로 __proto__을 사용하고 싶지 않습니다. 또한, 이것은 일종의 이상한 생각이었습니다. 나는 그것을 작동시키고 싶습니다. 그러나 가능하지 않다면 나는 살 것입니다. 하지만 내 질문은 내가 할 수있는 일이라고 생각하는거야?

답변

2

매력적인 아이디어. ESM5를 사용하지 않고도 표준 ECMAScript로 할 수 있다고 생각하지 않습니다.

ES5 우리에게 Object.create으로 (생성자 함수를 통해 갈 필요없이) 개체를 만드는 프로토 타입을 설정하는 수단을 제공을 포함하여 프로토 타입을 통해 더 나은 액세스 및 제어를 제공하지만, 당신은을 통해 기능을를 구성 할 수 기구. instanceof은 추상 사양 인 [[HasInstance]]을 사용하기 때문에 현재 함수에서만 구현되며 function implementation of it은 함수의 prototype 속성에 대한 객체의 밑받침 프로토 타입 ([[Proto]])이 ===인지 확인하여 작동합니다. 표준 개체의 기본 프로토 타입을 설정하는 방법은 new MyFunction을 통해 또는 Object.create을 통해 만들고, 어느 메커니즘도 함수 개체를 만들지 않습니다.

ES. 다음이 가능할 수 있습니다. "set prototype operator", <|에 대해 "조화"상태 (매우 정교 함)로 승격 된 제안은 현재 __proto__을 통해 해결 된 많은 문제를 해결하기위한 것입니다. 그 중 하나는 "함수의 프로토 타입을 Function.prototype이 아닌 다른 것으로 설정"입니다. (현재의 형태로)를 사용하여 MyFunction는 다음과 같이 보일 것입니다 :

마지막 비트는, MyFunction.prototype 프로토 타입 Function.prototype을 가진 객체입니다 그것을 확인하는 것입니다
function MyFunction() { 
    return MyFunction.prototype <| function() { return 'hello'; }; 
} 
MyFunction.prototype = Object.create(Function.prototype); 

그래서 MyFunction를 통해 건설 기능 call을 가지고, apply, bind

+0

Bummer, 나는 또한 다음 양식에도 '__proto__' 형식이 공식적으로 추가 될 것이라고 들었습니다. 나는 나의 시간보다 앞서 있다고 생각한다. – SpaceFace

관련 문제