2014-03-05 2 views
3

공개 프로토 타이프 패턴을 사용하여 "클래스"를 확장하려고합니다. 예로 저는 동물과 물고기가 있습니다. 여기 공개 프로토 타입 패턴이 다른 공개 프로토 타입 패턴의 범위를 확장 할 수 있습니까?

내가에게 수 있도록하고 싶습니다 내용은 다음과 같습니다
  • 이 물고기 프로토 타입에 새 멤버를 추가 필요한 경우 동물의
  • 재정의 멤버 동물에서 프로토 타입을 상속 할

    • 물고기
    • "class"와 "class"모두에 대해 공개 프로토 타입 패턴을 사용하면서이 모든 작업 수행

    동물 "cla SS "

    var Animal = function(data) { 
        this.name = "" 
        this.color = ""; 
        this.weight = 0; 
    }; 
    
    
    Animal.prototype = function() { 
        var eat = function() { 
        document.write(this.name + " is eating.<br>"); 
        } 
    
        return { 
        constructor: Animal, 
        eat: eat 
        }; 
    }(); 
    

    그리고 나는 물고기 만들 수 있습니다"동물에서 상속 클래스 "나는 문제가 실행 해요 곳

    var Fish = function(data) { 
        this.isSwimming = false; 
    }; 
    
    
    Fish.prototype = new Animal(); 
    

    물고기의 프로토 타입입니다. Fish에 대한 공개 프로토 타입 패턴을 사용할 수 있습니까? 여전히 Animal의 프로토 타입을 상속하고 필요한 경우 Animal을 재정의 할 수 있습니까? (제 3 자 라이브러리를 사용하는 것에 완전히 반대하지는 않지만 그렇게하지 않는 것이 좋습니다.) 예를 들어, eat()을 재정의하고 수영이라는 Fish에 새 함수를 추가하는 방법은 무엇입니까?

    편집 :

    다음은 내가 작성한 것입니다. 이것은 내가 필요한 것을하는 것처럼 보입니다. 내가 놓친 게 있니?

    Fish.prototype = new function(proto) { 
        var base = proto.constructor; 
    
        var eat = function(data) { 
        new base().eat (data);//This is just to show you can call the base. If needed. 
        document.write("fish eating.<br>"); 
        }; 
    
        var swim = function(){ 
        document.write("fish is swimming.<br>"); 
        }; 
    
        var thisProto = { 
        constructor: Fish, 
        eat: eat, 
        swim: swim 
        }; 
    
        for (var propt in thisProto) { 
        proto[propt] = thisProto[propt]; 
        } 
    
        return proto; 
    }(new Animal()); 
    

    편집 : 주요 포인트 중 하나는 새로운 키워드를 사용하지 내가 허용 대답에서

    했다. 그래서 나는 새로운 키워드와 Object.create() 사이의 차이점을 연구했다. 내가 올바르게 이해한다면, 둘 다 기본적으로 같은 일을하지만, Object.create()는 new 키워드가 생성되는 동안 객체 생성자를 호출하지 않을 것입니다. 생성자에서 정의 된 무언가를 상속해야하는 경우 new 키워드를 사용하거나 해당 멤버를 프로토 타입으로 이동해야합니다. http://plnkr.co/edit/322WB4jyCJberABbb0P0

  • +0

    가능한 중복 [JS는 프로토 타입 패턴을 공개 상속을 구현하는 방법?] (http://stackoverflow.com/questions/9248655/how-to-implement-inheritance-in-js-revealing -prototype-pattern) – Bergi

    +0

    @Bergi, 지금 당신의 대답을 테스트하고 있습니다. 나는 어제 다른 답변을 보았지만 그 주위에 내 머리를 잡지 못했습니다. 이제 나는 그것을 보았을 때 더 이해하기 쉽고 중복되었을 수도 있지만 귀하의 대답이 더 많은 정보를 추가한다고 생각합니다. – Jeff

    답변

    2

    내가 실종 아무것도 :

    여기이 좀 더 실험하는 데 사용되는 쿵하는 소리입니다?

    예.

    Do not use new

    new function(proto) { 
    
    .

    Do not use new

    new base().eat (data);//This is just to show you can call the base. If needed. 
    
    . 여기서 새 인스턴스를 만들지 만, 원하는 것은 물고기 인스턴스의 base.prototypecall에서 eat 메서드를 가져 오는 것입니다.

    proto = new Animal() 
    

    Do not use new!


    Fish.prototype = (function(super) { 
        var proto = Object.create(super); 
    
        function eat(data) { 
        super.eat.call(this, data); 
        document.write("fish eating.<br>"); 
        } 
        function swim(){ 
        document.write("fish is swimming.<br>"); 
        } 
    
        proto.constructor = Fish; 
        proto.eat = eat; 
        proto.swim = swim; 
    
        return proto; 
    })(Animal.prototype); 
    
    +0

    왜 다음과 같은 방법으로 생성자를 설정하지 않았습니까? var Fish = function (data) {Animal.call (this, data); }; 이 기사의 예제 목록은 http://stackoverflow.com/questions/9248655/how-to-implement-inheritance-in-js-revealing-prototype-pattern에서 볼 수 있습니다. 나는 그것이 여기에서 행해지고 있지 않다는 것을주의한다. – user1790300

    +0

    @ user1790300 아, 여기에 '물고기. 프로 타입'패턴을 집중적으로 다뤘다. 예, 생성자는 속성 초기화를위한 슈퍼 생성자를 호출해야합니다. 내 대답은 – Bergi

    +0

    입니다.이 수준의 자바 스크립트 개발, 사과에 익숙하지 않지만 Object를 사용하는 경우 기본 생성자를 초기화하는 방법에 대해 혼란 스럽습니다. .create (super)를 실행하여 동물 객체의 새 인스턴스를 만들면 연결이 끊어지는 것처럼 보입니까? 이것은 proto가 Animal.call이 인수를 전달하는 Animal의 동일한 인스턴스를 가리키고 있다는 것을 의미합니까? 이 질문이 왼쪽 필드 인 경우 사과드립니다. – user1790300