2017-11-07 1 views
0

JavaScript에서 프로토 타입 개념이 생소했습니다. 프로토 타입 '상속'을 수행하는 많은 방법이있는 것처럼 보이기 때문에 혼란 스럽습니다. Java 백그라운드에서 오는 코드는 대부분 고전 OOP처럼 구조화되어 있습니다. 이는 쉽게 이해할 수있는 방법이기 때문입니다.프로토 타입 함수가 정의되지 않았습니다

프로토 타입에 정의 된 함수를 호출하고 싶지만, Uncaught ReferenceError: getShape is not defined이 발생합니다. 나는이 프로토 타입을 올바르게 수행하고 있는지 확신 할 수 없다.

function mouseOverAnimation($main,svgId) { 
    this.svg = getShape(svgId,$main); // this line works 

    function getShape(shapeId,parent) { 
     if (parent == undefined) { parent = svg; } 
     var shape = parent.find(shapeId); 
     return shape; 
    } 
} 

function someAnimationTest($main) { 
    this.prototype = new mouseOverAnimation($main,'#icon1'); 
    this.ball1 = getShape('#ball1'); // this line is giving me the error 
} 

new someAnimationTest($('body')); 

은 내가 뭘하려고 오전 곧 설명하기 위해 : 나는 여러 SVG 아이콘을 가지고 각자가 마우스 오버에 애니메이션을 필요로 여기

내 코드의 조각이다. 애니메이션의 코드는 특정 동작을 제외하고 대부분 동일하므로 프로토 타입을 사용하는 것이 좋은 생각이라고 생각했습니다. 모든 아이콘에 대해해야 할 첫 번째 일은 내가 독립적으로 움직여야하는 모든 모양에 대해 vars를 얻는 것입니다. 이것은 내가 getShape() 기능으로 무엇을하려하는지입니다.

getShape() 함수는 실제로 this.prototype = new mouseOverAnimation()을 호출하여 상속 되나요? 어떻게 불러야합니까? 주요 문제와 관련 될 수있는 몇 가지 측면 질문

부속 :

좀 더 복잡한 자바 스크립트 상당히 새로운입니다. 그 때문에 나는 this, prototype과 내가 '오버로딩'기능을 수행하는 방법을 잘 모르고있다. 제발 진정으로 좋지 않은 것을 수정 해주세요. 또한이 스 니펫에는 jQuery가 사용됩니다. 애니메이션에 사용중인 라이브러리에 jQuery가 포함되어 있기 때문에 내가 사용한 예제에서 이와 같이 사용되었습니다. 그러나이 경우에는 실제로 필요하지 않습니다. 편의상이 $('body')을 사용하는 것이 좋습니까? 아니면 바닐라 JS로 변경하는 것이 더 낫습니까? someAnimationTest 방법의 범위에는 getShape 방법이 없기 때문에

+1

앞에'새로운 mouseOverAnimation로 호출 할 필요가 (...)'인스턴스'에서 속성을 상속하는 것 mouseOverAnimation.prototype'입니다. 지역 변수는 상속되지 않습니다. 나는 당신의'someAnimationTest'도 아무것도 상속 받아야한다고 생각하지 않습니다. – Bergi

+0

나는이 프로토 타입 상속을 전혀 이해하지 못한다는 것이 분명하다. 나는 그것을 더 공부하기 위해 되돌아 갈 필요가있다. 이것에 대한 좋은 소식통에 대한 조언이 있습니까? 상속해야하는'mouseOverAnimation()'에 많은 vars와 함수가 있습니다. 나는 정말로 mouseOverAnimation()을 상속하기 위해서 다른 함수들을 필요로한다. 나는 아마 지금 고전적인 OOP 개념에 너무 붙어있다. – Rick

+0

'getShape'가 애니메이션 객체의 * method *이어야하는 이유가 전혀 없습니다.정적 헬퍼 (helper) 함수로 더 잘 맞을 것 같아요. 어디에서나 호출 될 수 있습니다. – Bergi

답변

1

I want to call a function defined in the prototype, but I am getting Uncaught ReferenceError: getShape is not defined.

는이 오류를 얻고있다. 이 mouseOverAnimation의 프로토 타입의 속성하지 때문에

Is the getShape() function actually inherited by calling this.prototype = new mouseOverAnimation()?

getShape 방법은 상속되지 않습니다.

How should I call it?

당신은 mouseOverAnimation의 재산

function mouseOverAnimation($main,svgId) { 
    this.getShape = function (shapeId,parent) { 
     if (parent == undefined) { parent = svg; } 
     var shape = parent.find(shapeId); 
     return shape; 
    } 
    this.svg = this.getShape(svgId,$main); // this line works  
} 

getShape 방법을 노출하고

function someAnimationTest($main) { 
    this.moaInstance = new mouseOverAnimation($main,'#icon1'); //not using this.prototype as this has nothing to do with prototypical inheritence 
    this.ball1 = this.moaInstance.getShape('#ball1'); //notice that method is invoked via the instance of mouseOverAnimation 'this.moaInstance' 
} 
+1

'this.prototype' 속성을 피하기를 권합니다. 프로토 타입 상속과는 아무런 관련이 없으므로 혼란을 가져옵니다. – Bergi

+0

@Bergi 감사합니다. 관련 수정 사항을 작성했습니다. – gurvinder372

+0

편집하기 전에 다음과 같이 입력합니다 : 2 행에서'Uncaught ReferenceError'를 얻습니다.'2 행을'this.svg = this.getShape (svgId, $ main);'로 변경하고 그 선 앞에 함수 선언을 옮겼습니다. 선언 된 후에 만 ​​호출됩니다. 그렇지 않으면 그것은'TypeError : this.getShape is not function'을 제공합니다. 이유를 정말로 이해하지 마라. 이제이 유형의 상속을 이해할 수 없다는 이유로 더 많은 오류가 있습니다. 당신은 이것이 프로토 타입 상속으로 인해 만기가되는 것이 아니라고 말하고 있습니다. 그러나 상속해야 할 많은 vars와 함수가 있기 때문에 필요하다고 생각합니다. – Rick

관련 문제