2013-11-28 4 views
1

this question과 유사하게 Douglas Crockford의 자바 스크립트, 좋은 부품을 따르고 있습니다. 4 장에서, 그는 매우 혼란 스럽다. 그는 다음 새 integer 방법 테스트이 JavaScript 확장 방법은 어떻게 작동합니까?

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

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

: 그는이 샘플 코드 기록

document.writeln((-10/3).integer()); // -3 

내가 this.prototype[name]의 구문을 이해하지를 (특히, 괄호) 또는 Math[this < 0 ? 'ceiling' : 'floor'](this)이 (다시, 대괄호 및 Math이 어디서 왔는지). 더 중요한 것은 누군가가 코드가 일반적으로 어떻게 작동하는지, 테스트 코드가 작동하는 이유를 설명 할 수 있습니까?

+0

'obj.foo;''obj [ "foo"];'var foo = "foo"; obj [foo];'모두 같은 결과를줍니다. –

답변

4

Function.prototype을 확장하면 모든 기능에서 사용할 수있는 방법을 추가 할 수 있습니다. 자바 스크립트의 함수는 객체이기 때문에 속성과 메소드를 가질 수 있습니다. call 또는 apply.

method 함수 메서드를 사용하면 주어진 함수의 프로토 타입에 메서드를 추가 할 수 있습니다. Number은 함수입니다. 숫자의 생성자는 prototype입니다. 프로토 타입에 추가하는 함수는 객체의 모든 인스턴스에 사용할 수 있습니다.이 경우 숫자입니다.

Math은 대괄호 표기법을 사용하여 JavaScript의 내장 객체로, 객체의 속성에 동적으로 액세스 할 수 있습니다. 당신이 문자열로를 작성하지 않는 경우에도, 키는 단지 문자열 객체를 기억, 그들은 여전히 ​​예를 들어, 문자열 대괄호 표기법에 액세스 할 수 있습니다 단순히 경우를 결정하는 것 Math의 경우

var obj = { 
    key: 'hello' 
}; 

var k = 'key'; 

obj[k]; //=> 'hello' 

이 조건에 따라 ceil (안 "천장") 또는 floor를 사용해야합니다, 당신은 다음과 같이 쓸 수있다 :

if (this < 0) { 
    Math.ceil(this); 
} else { 
    Math.floor(this); 
} 
4

자바 스크립트가 이상해.

대부분의 언어에서 foo = someObject.someMember을 사용하고 JS도 허용합니다.

그러나 그것은 또한 당신이 문자열은 객체를 활용할 수있는 매우 동적 코드를 쓸 수있어 이제 변수

var memberName="someMember" 
foo = someObject[memberName] 

로 대체 될 수 있음을 깨달을 때까지 ... 바보 같다 foo = someObject["someMember"]을 수행 할 수 있습니다 회원은 코드를 작성할 때 해당 멤버의 이름을 알지 못합니다. 이것은 게시 한 코드가 수행하는 것입니다. 처음에는 더러워졌지만 그 감정은 지나갈 것입니다.)

관련 문제