2013-10-13 4 views
1

'Java Script the Good Parts'라는 책에서 예제 중 하나를 시도하고 있습니다. 아래 코드를 찾으십시오.유형을 늘리거나 메서드를 찾을 수 없음

숫자에 정수가 없다는 오류가 발생합니다. 문제를 이해하도록 도와주세요.

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceiling' : 'floor'](this); 
}); 

위의 코드를 실행 한 결과, 메소드의 정수

Number.prototype.integer 

그것은 함수 표시를 부착 Number.prototype.

Number.integer 

이는 정의되지 않았습니다.

Number.integer(10); 

내가 얻을 - 번호() {[native code가]}있는 방법 '정수'

이 없습니다 내가 잘못 가고 어디에 확실하지 않다.

나는 ceil을 ceil로 바꾸어 보았습니다. 여전히 작동하지 않습니다.

+4

_ "나는 ceil을 ceil로 대체하려고 시도했습니다."- 그게 주된 문제는 아니지만 분명히 변경해야합니다. "ceil"은 올바른 메소드 이름입니다. . – nnnnnn

+1

'(3.14) .integer()'와 같이 부르면 안 될까요? – thgaskell

답변

1

당신은 Number인스턴스에 할당 된 프로토 타입 방법을 추가하고, 당신은 Number 함수 자체에 추가 아닙니다.

Number 인 메소드를 다음과 같이 호출하십시오. Live Example |

var n = 3.1415; 
var i = n.integer(); 
console.log("i = " + i); // "i = 3" 

또는 숫자 문자와 Live Source : Live Example | 위의 두 번째 줄에, 내가 괄호에 자신의 3을 넣어해야한다고 Live Source

console.log(3.1415.integer()); // "3" 
console.log((3).integer()); // "3" 

참고; 그렇지 않으면 JavaScript 파서는 .이 속성 접근자가 아니라 소수점이라고 생각합니다.


사이드 노트 : 열거 가능한 속성을 사용하여 미리 정의 된 유형의 프로토 타입을 확장하는 것은 약간 위험 할 수 있습니다. 사람들이 Number 또는 String을 확장 할 때 어떤 중요한 문제도 본 적이 없지만 Array 또는 Object을 확장하면 개의 메이저 문제가 있으므로 그렇게하지 않을 것입니다.


사이드 노트 2 : 내 예에서 위, 나 또한 Math.ceil의 이름 (그것의 ceil하지 ceiling)를 수정했습니다.

+0

고맙습니다. 알았다. 프로토 타입에 첨부 된 메서드를 사용하려면 Number 인스턴스를 만들 필요가 있지만 Number 함수 자체에는 필요하지 않습니다. – Santosh

1

다음은 지정된 클래스의 메소드를 정의하거나 해당 유형의 모든 인스턴스 또는 객체가 그 방법을 상속되도록 입력하는 데 도움이 Function의 프로토 타입에 추가 (자바 스크립트에서 좋은 부품을 촬영) method 기능 .코드에서

두 가지 문제 : 그것은 사실이 아니다 클래스 또는 생성자 함수를 Number 자체에 정의 된 것처럼 당신은 integer를 호출

  1. , 그것은 Number의 프로토 타입에 정의됩니다. 함수가 실제로 Number 자체에 정의 된 경우, 다음과 같이 정의 된 것이다 :

    Number.integer = function() { /* Implementation */ }; 
    
  2. 당신은 때로 믿을 함수의 본문에 있지만, 기능 (즉 Number.integer(10))에 매개 변수를 전달하는 그 숫자를 다루지 않고, 어떤 매개 변수도 받아들이라는 함수를 선언하지 않았다. 나는이 숫자가 함수 내의 this 키워드에 의해 참조되고 있다는 것을 혼동스러워하지만 그것은 정확하지 않습니다.

    var a = 10.3; // Now a is a Number instance and so it inherits the integer() method 
    console.log(a.integer()); // call the method on a 
    

    심지어 리터럴에 직접 호출 할 수 있으며 자동으로 포장됩니다

method 기능을 사용하면 지정된 유형의 메소드를 정의하고이 같은 혜택을 누릴 수 있습니다

console.log((32.543).integer()); 
+0

감사합니다. 알았다. 프로토 타입에 첨부 된 메서드를 사용하려면 Number 인스턴스를 만들 필요가 있지만 Number 함수 자체에는 필요하지 않습니다. – Santosh

+0

@SantoshMarigowda 알겠습니다. 오신 것을 환영합니다. –

관련 문제