2009-05-17 7 views
3

개체를 많이 사용하는 첫 번째 자바 스크립트 프로젝트를 만들고 있습니다. 때문에 그것이 작동하는 방법의 거의 모든 사용자 정의 객체는 다음과 같이 수행됩니다 :자바 스크립트 "클래스"(프레임 워크 없음)

모든 사용자 객체는 어쨌든 하나의 인스턴스를 가지고 (하위 객체의 예는 UI, 도구는있다, 괜찮
namespaceobj = {}; 
namespaceobj.subobject = {}; 
namespaceobj.subobject.somefunction = function(arg, uments) { 
    // Do Stuff 
} 
namespaceobj.subobject.somedata = 10; 
namespaceobj.othersubject = {}; 
namespaceobj.othersubject.somefunction = function(some, args) { 
    // Do more stuff 
} 
// More subobjects etc. 

공유 데이터 등). 나는이 같은 코드 다 뭔가를 보았다 그러나

사람이 설명 할 수

function SomeClass() { 
    this.somedata = 42; 
    this.somefunction = function(a, few, args) { 
     // Do Stuff 
    } 
} 
// More classes and stuff 
// Elsewhere: 
someInstance = new SomeClass(); // AFA I recall, new was optional 
someInstance.somefunction(); 

(문법은 아마 잘못이 그냥 메모리에서 유사한 코드를 보는 것입니다) 어떻게 두 번째 예제 작업에서 "클래스" 그리고 그들을 사용하는 동안 발생할 수있는 함정.

답변

2

생각이 같은 모습을 생각했다 구문 : -

function SomeClass() { 
    var somedata = 42; 
    this.somefunction = function(a, few, args) { 
    // Do Stuff like:- 
    return somedata + a; 
    } 
} 
// More classes and stuff 
// Elsewhere: 
someInstance = new SomeClass(); // AFA I recall, new was optional 
someInstance.somefunction(15); //returns 57 

함수가 실행될 때 결과 실행 컨텍스트에서 생성 된 된 SomeFuncion에 할당 된 기능 (이 경우 someClass()가 someInstance에 할당 된 새 작업의 일부로 실행될 때). 함수는 생성 된 실행 컨텍스트의 일부인 변수에 액세스 할 수 있으므로이 경우 somedata는 somefunction이 액세스 할 수있는 변수입니다.

이 접근 방식은 SomeClass 함수 본문 내부에서 생성 된 함수 만이 액세스 할 수 있기 때문에 somedata를 효과적으로 개체의 개인 상태로 만듭니다.

는 약 범위 체인프로토 타입 체인을 배울 먼저 OO 프로그래밍을 참조하지 않고 자바 스크립트를 연구 고려해야한다, 지나친 단순화이다. 이 점을 이해하면 자바 스크립트에서 객체 지향 디자인을 구현하는 다양한 접근법의 수를 더 잘 이해할 수 있으며 필요에 가장 잘 접근 할 수 있습니다.

0

두 번째 예가보다 명확하고 데이터가 캡슐화됩니다. 즉, 일부 클래스 변수는 임시 변수를 사용하여 계산할 수 있습니다. 또한 두 번째 예제는 동일한 유형의 객체를 더 만드는 데 더 좋지만, 중요하지는 않습니다. 어쨌든 코드가 느려지지 않으므로 원하는대로 할 수 있습니다.

2

이것은 꽤 큰 주제이지만 개체 리터럴 표기 (첫 번째 예)과 JavaScript의 OOP라는 특정 브랜드의 차이입니다. 이 둘 사이의 주요 차이점은 첫 번째 예제에는 하나의 정적 인스턴스 만 있고 두 번째 예제의 수정 된 버전 (닫은 상태)은 클래스의 여러 인스턴스를 만들 수 있다는 것입니다.

난 당신이 JavaScript and Object Oriented Programming (OOP)을 읽을 것을 제안 :

자바 스크립트 쓰기 객체 지향 웹 응용 프로그램에 훌륭한 언어이다. 프로토 타입을 통해 상속을 지원하고 속성과 메서드를 지원하므로 OOP 을 지원할 수 있습니다. 많은 개발자가 JS를 적절한 OOP 언어로 캐스팅했기 때문에 C# 및 Java의 클래스 스타일에 을 사용했기 때문입니다. 많은 사람들은 JavaScript가 상속을 지원함을 인식하지 못합니다. 당신이 객체 지향 코드를 쓸 때 즉시 당신에게 힘을 준다; 당신은 재사용 할 수있는 코드를 작성하고 캡슐화 된 을 사용할 수 있습니다.

0

두 번째 형식은 프로토 타입에 많은 기능이있는 "클래스"를 만들기 때문에 더 나은 형식 일 수 있습니다. 새 클래스가 만들어지면 새 인스턴스도 프로토 타입을 같은 것으로 설정합니다. 클래스 예제에서 함수는 프로토 타입에 있습니다.

첫 번째 예제는 단순히 필요한 때마다 동일한 기능을 각 개체에 재 할당하는 많은 기능을 가진 개체를 만듭니다.

프로토 타입은 "클래스"를 정의하는 작업이 한 번만 수행되기 때문에 바람직합니다. 모든 인스턴스가 동일한 프로토 타입을 공유하므로 하나의 함수를 추가/변경/제거하는 등 강력한 구문을 구현할 수 있으며 모든 인스턴스에서 변경 사항을 확인할 수 있습니다. 첫 번째 예제에서는 인스턴스를 독립적으로 변경할 수있는 독립 개체입니다.

결국 모든 Javascript 개체는 속성 및 기능의 해시 테이블입니다. 하나가 "object.something"을 통해 객체에 액세스하면 모든 것이 함수를 포함하는 값입니다. 그러나 함수 호출 표기법 "object.foo (...)"를 사용하면 런타임은 "object"에서 "foo"를 찾으려고 시도합니다. 런타임이 "객체"에서 "foo"를 찾지 못하면 "객체"의 프로토 타입에서 "foo"를 찾습니다. 이것은 무언가가 발견되거나 프로토 타입이 더 이상 남아 있지 않을 때까지 계속됩니다.

런타임은 매개 변수를 전달하는 등의 "foo"호출을 시도합니다. 당연히 foo가 함수가 아니면 일이 터집니다.

관련 문제