2014-02-09 2 views
2

프로토 타입 형 상속을 자바 스크립트로 이해하려고하지만 다음과 같은 경우에는 적용되지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 이 생성자와Javascript의 프로토 타입 체인이 업데이트되지 않았습니다.

var base = function() { 
    var priv = "private"; // Private 
    var publ = "public"; // Public through a getter/setter (below) 

    // The object to return 
    var f = {}; 

    f.publ = function (new_val) { 
     if (!arguments.length) { 
      return publ; 
     } 
     publ = new_val; 
     return f; 
    }; 

    return f; 
}; 

, 나는 base();를 호출하여 개체를 만들 수 있습니다 다음과 같이

나는 생성자를 정의하고있다. 이러한 객체에는 public 메소드 (publ)가 있습니다. f.prototype = base();

var myclass = function() { 

    // Other parameters defined here 

    var f = function() { 
     // publ is inherited 
     console.log(f.publ()); 
    }; 

    // Trying to set the prototype of f to the object created by "base()" 
    f.prototype = base(); 

    // Other methods defined here 

    return f; 
}; 

내가 F를 만들고 싶어 :

이제 동일한 구조를 다음, 나는 위에서 정의 된 "기본 생성자"에 의해 만들어진 객체에서 상속 객체를 생성하는 새로운 생성자를 가지고 싶습니다 base()에 의해 반환 된 객체에 정의 된 모든 메소드를 상속하지만 f는 방법 1802

환영받을 것입니다 무슨 일이 일어나고 있는지 이해하는 데 어떤 도움이 없기 때문에 f.publ를 호출하려고하는 것은 불평

M;

function Base() { 
    var priv = "private"; 
    this.publ = "public"; 
} 

이제 new Base를 사용 Base의 인스턴스를 만들 수 있습니다 다음과 같이

+0

프로토 타입 상속이 필요 중 하나'새를 :


다음과 같은 답변에 대해 살펴 프로토 타입 상속에 대한 자세한 내용을 보려면 '연산자 또는'Object.create'. 너는 여기도 사용하지 않고있다. – Eric

+0

이것은 생성자처럼 보이지 않습니다. 당신은'new'와 함께 생성자를 사용할 것입니다. 모듈 패턴과 비슷해 보입니다. – elclanrs

+0

여러 의견에서 언급했듯이 Object.create를 사용하여 상속의 프로토 타입 부분을 설정하고 Child에서 Parent.call (this, args)을 수행합니다 (이는 부모로부터 Instance 멤버를 상속받습니다). 더 자세한 정보는 http://stackoverflow.com/a/16063711/1641941 – HMR

답변

2

프로토 타입 상속을 할 수있는 가장 일반적인 방법입니다. 다음으로 우리는 MyClass 생성 다음과 같이

MyClass.prototype = new Base; 

function MyClass() { 
    alert(this.publ); 
} 

마지막으로 당신이 new MyClass를 사용 MyClass의 인스턴스를 만들 수 있습니다

var a = new MyClass; // alerts "public" 

자신을 위해 데모를 참조하십시오 : 자바 스크립트에서 http://jsfiddle.net/b3QyE/


프로토 타입 상속 할 수 그것은 약간의 혼란 스러워요 constructor-centric instead of prototype-centric입니다. 그래서 내가 followin을 사용하는 것을 선호합니다. g 유틸리티 기능은 "클래스"를 만들 수 있습니다 :

function defclass(base, body) { 
    var uber = base.prototype; 
    var prototype = Object.create(uber); 
    var constructor = (body.call(prototype, uber), prototype.constructor); 
    constructor.prototype = prototype; 
    return constructor; 
} 

는 다음과 같이 이제 코드를 재구성 할 수 defclass 사용 :

var Base = defclass(Object, function() { 
    this.constructor = function() { 
     var priv = "private"; 
     this.publ = "public"; 
    }; 
}); 

var MyClass = defclass(Base, function (uber) { 
    this.constructor = function() { 
     uber.constructor.call(this); 
     alert(this.publ); 
    }; 
}); 

그것은 훨씬 더 읽기 쉽고 이해합니다. 모든 것이 단일 함수 범위 내에 캡슐화되고 아무 것도 제자리에 매달리지 않습니다. 또한 프로토 타입 상속을 이해할 필요가 없습니다. 업데이트 된 데모보기 : http://jsfiddle.net/b3QyE/2/

MyClass 생성자에서 Base 클래스 생성자 함수를 호출하는 것을 볼 수 있습니다. 이를 통해 Base 클래스 생성자를 사용하여 인스턴스를 초기화 할 수 있습니다. uber을 통해 Base 클래스의 모든 메소드를 호출 할 수 있습니다.

  1. JavaScript inheritance and the constructor property
  2. How to achieve pseudo-classical inheritance right on the class declaration?
  3. Benefits of prototypal inheritance over classical?
자바 스크립트
+3

참고 : 상속을 설정하는 더 좋은 방법은'new Parent'가 아닌'Object.create (Parent.prototype)'을 사용하는 것입니다. http://stackoverflow.com/a/17393153/218196 * 편집 : * 아 그게 당신이'defclass' 함수에서하고있는 것입니다 : D –

+0

당신은 Crockford를 인용하고 있습니다. 자신이 "가상 클래식 상속"이라고 부르는 것을 정확하게 사용하는 기사 나 프리젠 테이션을 만들 수도 있습니다. JavaScript에 익숙하지 않은 사용자는 생성자 함수와 프로토 타입을 사용하는 방법에 대한 올바른 문서화로 인해 더 많은 이점을 얻을 수 있습니다. – HMR

+0

@HMR 어쩌면 JavaScript에 익숙하지 않은 누군가가 하스켈을 배우는 데 많은 도움이 될 것입니다. 진지하게, 하스켈을 배우면 더 나은 JavaScript 프로그래머가됩니다. –

관련 문제