2014-11-15 5 views
0

여러 유형의 수학적 개체가 비슷한 연산자를 사용하는 수학 시스템을 생각해보십시오. 배열을 더하거나 복소수를 곱할 수 있습니다. 그러나 이러한 연산자는 기본적으로 존재하지 않으므로 작성해야합니다. 프로토 타입 함수 정의에서 문자열 이름을 만들고 사용할 수 있습니까? 다음 (예정) 코드 고려 : 내가 좋아하는 뭔가를 할 때 표시되는 특정 오류가 발생프로토 타입의 함수에 대한 문자열 이름 만들기

var Interval = function(s,e) { 
    this.a = Math.min(s,e); 
    this.b = Math.max(s,e); 
}; 

Interval.prototype["*"] = function(x,y) { 
    var t = x.a*y.a; 
    var u = x.a*y.b; 
    var v = x.b*y.a; 
    var w = x.b*y.b; 
    return new Interval(Math.min(t,u,v,w), Math.max(t,u,v,w)); 
}; 

Interval.prototype["*="] = function(y) { 
    var ret = this["*"](this, y); 
    this.a = ret.a; 
    this.b = ret.b; 
}; 

참고 다음

var i=new Interval(1,2); 
i["*="](i); 

그리고 파이어 폭스는 두 번째 줄은 언급되지 않는다는 불평 함수.

많은 기능 ("*=","-","^",...)이 있습니다. 이 이름으로 직접 저장하는 것이 좋겠지 만 위의 방법을 시도하면 항상 실패합니다. "... 함수가 아닙니다."등. Interval.prototype.ops = { "*": function(x,y) {...}};과 같은 버퍼 객체를 넣을 수는 있지만, 그럴 수는 없다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

편집는 예상대로

이 메커니즘은 작동합니다. 작동하지 않는 것은 생성자 내에서 프로토 타이핑 된 함수를 호출하려고 시도하는 것입니다. 예를 들어, this["*="](this); 행이 var Interval = function(s,e) { ... }; 함수 정의 내에 나타날 경우. 내가 아니면 내가 물어 때 내 콘솔에서 다음

var i = function() { console.log("foo"); }; 
i["*"] = function() { console.log("bar"); }; 

그리고, 내가 얻을 [ "*"] : 당신이 프로토 타입을 피할 경우

+0

Interval 생성자에 전달 된 타입과 전자가 무엇인지 모르므로 min은 함수가 아닙니다. 또한 코드에서 min 및 max가 반환하는 형식을 나타내지 않습니다. 'var one = new Interval (?,?); ... one ['* = '] (two)'이 문제는 프로토 타입 함수와 관련이 없지만 인수를 프로토 타입 함수 또는 min 및 max의 반환 값에 전달했습니다. – HMR

+0

@hmr : 사실, 필자의 예제는 내가 포함하는 코드보다 추상화되어 있습니다. 수정되었습니다 ... – abiessu

+1

이것은 잘 작동합니다."... is not a function"오류가 발생했을 때 시도한 정확한 코드를 보여주십시오. – Bergi

답변

0

이 질문은 Javascript 기능이 작동하는 방법에 대한 내 자신의 이해가 실패한 결과 발생했습니다. 특히, 사실은 다음과 같은 방식으로, 함수 생성자 내에서 제 기능을 "기능을 프로토 타입"한 함수를 호출하려고 시도했다 :

var q = function() { 
    ... 
    q["blather"](); 
    ... 
}; 

q.prototype["blather"] = function() { 
    ... 
}; 

이 내 프로젝트의 의도 된 기능이 기대 작품으로

; 내 순진 테스트 방법은 실패하고이 질문을 일으켰습니다.

1

실제로이 작업을 수행 할 수 있습니다

> i 
< function() { console.log("foo"); } 
> i["*"] 
< function() { console.log("bar"); } 

나는 그들을 성공적으로 부를 수있다.

그냥 헤드 업 : 나는이 형식이 매우 어색하다는 것을 알았습니다!

+0

이것은 좋은 옵션입니다. 모든 객체에 이러한 함수를 수동으로 추가하는 것은 생성자의 프로세스가 될 것입니다 ...이 작업을 (대부분의 경우) 입력하지는 않지만 일련의 다른 함수 호출을 통해 전달하므로, 주어진 점에서 어떤 연산이 호출되는지를 반드시 알아야합니다 ... – abiessu

+0

왜 프로토 타입을 피하기를 원합니까? – Bergi

+0

@Bergi : 따라서 내 질문. 내 질문에 정확히 (지금 올바르게 쓰여진) 코드를 만들고 객체가 내가 만든 함수에 대한 액세스를 허용하지 않는다는 것을 알았습니다. – abiessu

1

귀하의 문제는 귀하가 선택한 속성 이름과 아무 관련이 없습니다. 대괄호 표기법을 사용하여 속성을 설정하거나 가져올 때 문자열은 사실상 아무 것도 될 수 없습니다. 단지 문자열 일뿐입니다.

this 키워드의 값을 this = this["*"](this, y);에 지정하려는 경우 ReferenceError의 원인은 무엇입니까?

+0

두 번째 예제 사용법이 실제 코드를 참조하지 않고 추가되었습니다. 그것은 실패한 첫 번째 예제이며 실제로 작업하기를 원하며 두 번째 예제는 또 다른 권장 사용법입니다. – abiessu

+0

두 번째 예를 수정했습니다. – abiessu

+0

문제는 (적어도 Firefox에서는) 괄호 표기법이'prototype' 특수 객체의 속성에 대한 올바른 접근자가 아니라고 생각됩니다. 점 표기법은 내가 가지고있는 모든 코드에서 잘 작동합니다. – abiessu

관련 문제