2013-02-21 3 views
0

나는이 질문에, 물을 많이 내가 모듈 패턴과 CommonJS 파일 형식 + Browserify을 사용하는 스위치가 자바 스크립트는 OOP 언어처럼 더 할 수 있도록 노력 중지 강에서 간을 만든 이후 UPDATE자바 스크립트에서 OOP를 사용하는 간단한 방법은 무엇입니까?

. 나는 자바 스크립트 Prototypal Inheritance와 Object.create을 받아 들였다. 나의 삶은 이제 어느 때보 다 나아졌다. 예, 거의 내가 new Religion에 가입 한 것처럼 느껴진다. 미안하다. religion ... JS에서 더 이상 "새로운"없다.

질문의 나머지

... 난 자바 스크립트에서 잠시 동안 OOP 놀아되고있다


바로 역사이다.

솔직히 내가 가진 느낌은 대부분의 시간이 사실 OOP가 필요 없다는 것입니다. OOP를 사용하여 다른 언어로 해왔 던 것은 대부분 자바 스크립트에서 함수와 클로저로 할 수 있습니다.

또한 OOP 방식을 모방하기 위해 수작업으로 만들거나 작은 라이브러리를 사용하여 만들 수있는 다양한 방법이 있습니다.

OOP를 시도해보고 싶었지만 찾은 모든 해결책이 그다지 간단하지 않은 것처럼 보였습니다. 일부는 init 메소드를 추가하라고 요청하거나 초기화 중에 초기화 함수를 사용하여 함수를 특별히 검사하고있었습니다. 그들은 무시 될 필요가있다. 그것이 영리한 동안 그것은 클래스에서 객체를 간단하게 생성하기에는 너무 과도한 것처럼 보였습니다.

UPDATE :이 실험,이 모든 화려한 종료 라이브러리를 교체 또는 생산

var Nexus = function() {}; // helper function to avoid create an instance of the child class 
Object._extend = function(child, parent) { 

    var base = Nexus.prototype = parent.prototype; 
    child.prototype = new Nexus(); 

    var cp = child.prototype; 
    cp.constructor = child; 
    child._parent = base; 
}; 




/* THIS THEN IS USED LIKE THIS */ 

var Person = function (name) { 
    this.name = name; 
    console.log('Person constructor'); 
}; 

$.extend(Person.prototype, { 
    walk : function() { 
    console.log(this.name + ' is Walking!!'); 
    } 

}); 

var Student = function() { 
    // call the base class constructor 
    Student._parent.constructor.apply(this, arguments); 
    console.log('Student Constructor'); 
} 

Object._extend(Student, Person); 

$.extend(Student.prototype, { 
    walk : function() { 
    console.log(this.name + ' walks like Student'); 
    //calling a parent method 
    Student._parent.walk.apply(this, arguments); 
    } 
}); 

var p = new Person('Jon Doe'); 
p.walk(); 
console.log(p instanceof Person) // true 

var s = new Student('Joan Doe'); 
s.walk(); 
console.log(s instanceof Person) // true 
console.log(s instanceof Student) // true 

당신이 볼 수 있듯이에서 사용할 수 없습니다

그래서 나는이 솔루션과 함께 접근 방식은 OOP에 무엇이 필요한지 을 충족시킵니다.

  1. 부모 클래스의 인스턴스 너무뿐만 아니라 오버라이드 (override) 메서드에 액세스 할 부모 클래스의 메소드를 호출 할 수있는 자식 클래스
  2. 자식 OBJ의 인스턴스 OBJ 아이. (CurrentClass._parent와 BaseClass.prototype의 유일한 차이점은 두 번째 클래스가 부모 클래스의 이름을 실제로 알 필요가 있다는 것입니다.

  3. 생성자를 만드는 것은 간단해야합니다.이 경우에는 함수 자체가 생성자입니다. 인스턴스화 중에 자동으로 호출되는 간단한 init 메소드는 필요 없습니다. 접근 방식에

단점은 내가 다음 :

  1. 내가 정말에만 상속 체인을 얻을 수있는 기본 클래스의 객체를 생성하고 싶지 않아요 (더미 클래스 넥서스 필요 제대로 작동하려면 ... Nexus가 트릭을 수행합니다.)
  2. 제대로 설정된 컨텍스트로 대체 된 메소드에 대한 액세스를 제공하지 않았습니다. 통화 또는 적용을 사용하여 컨텍스트를 변경하는 것은 소비자의 몫입니다.

올바른 프로토 타입 체인을 만드는 데 추가 Nexus 더미 함수를 사용하는 것이 메모리 관리의 문제입니까?

나는 적절한 테스트를 할 시간이 없었고, 내 상속 체인은 3 레벨보다 깊지 않았습니다. 그래서 거기에 미치는 영향은 아주 작을 것 같습니다.

라이브러리를 사용할 수는 있었지만 직접 작성하고 생성자에 초기화 코드를 추가하는 데 실패한 코드를 작성하는 것이 매우 간단 해 보였습니다.

더미 Nexus 기능을 추가하면 눈에 띄는 영향이 있습니까?

+1

내 의견으로는 JavaScript에 대한 OOP가 다소 부적절하다는 귀하의 직감은 정확합니다. – Pointy

+0

그래, 실제 사용보다 실험으로 더 많이했습니다. 그래서 내가 묻는거야. 귀하의 의견에 감사드립니다. –

+0

@Point 및 OP 감사합니다. 마지막으로 JavaScript를 아예 사용하지 않는 사람은 OOP입니다. 왜냐하면 그렇지 않기 때문에 범위를 가지고 노는 것입니다. 모듈 패턴을 사용하여 데이터를 숨길 필요가 있다면 미쳐 버리십시오! – defaultNINJA

답변

2

올바른 프로토 타입 체인을 만들기 위해 추가 Nexus 더미 함수를 사용하는 것이 메모리 관리의 문제입니까?

아니요. 메모리에 한 개의 추가 객체가 있습니다. Object._extend 기능으로 옮기면 자동으로 가비지 수집됩니다.

그러나 Nexus 대신에 Object.create을 사용해야합니다. Understanding Crockford's Object.create shim을 참조하십시오.

+0

피드백을 보내 주셔서 감사합니다. Object.create shim을 시도해 보겠습니다. –

+0

실험을 위해 그것을 심어야 할 필요가 있습니다 :-) 코드를 연계한 이유를 이해하는 데 도움이되는 링크 만 있으면됩니다. 또한 http://stackoverflow.com/q/4166616/1048572 및 http://stackoverflow.com/q/2709612/1048572를 참조하십시오. – Bergi

+0

object.create가 바로 새 객체를 만들 수 있습니까? 따라서 미리 정의 된 클래스에서 새 Object를 만드는 것이 실제로는 아닙니다. 내가 거의 3 단계 이상의 상속이 필요하다고 말하는 것은 어떤 경우에도 괜찮습니다. –

관련 문제