2012-11-07 2 views
0

최근에 프로젝트 프로토 타입을 사용하기 시작했습니다. 그것은 프로토 타이핑을 사용하는 나의 첫 번째 시간 중 하나입니다. 그래서 여전히 다리를 찾는 것입니다. 나는 객체 지향적 인 배경에서 왔기 때문에, 일부 용어가 정확하지 않을 때 나를 용서해줍니다."class"에서 프로토 타입 함수로 선언 된 함수 호출 : JavaScript 프로토 타입

내가 사용하는 주된 이유 중 하나는 나중에 충돌을 피하기 위해 프로젝트의 범위 지정 프레임 워크를 만드는 것입니다. 또한 여러 파일에 분산 된 개체를 만들 수 있도록이 도구를 사용합니다.

그러나 뭔가 문제가 있습니다.

내베이스 "클래스"를 하나의 파일로 선언합니다. 다른 파일에서 클래스의 확장을 선언합니다. 이 확장에서 필자는 기본 클래스에서 호출하려고하는 함수를 선언합니다. 마지막으로 기본 클래스에서 확장 함수를 호출 할 수 있도록 기본 클래스 내부에 확장 인스턴스를 선언합니다.

leave.js

var _LEAVE = function() { 
    this.WORK_LIST = new this._WORK_LIST(); 
} 

작업 목록 : 여기

SCRIPT445: Object doesn't support this action leave.js, line 2 character 5

이 내 코드의 조각이다 : 나는 인스턴스를 시도하고 만들 때

그러나, 나는 다음과 같은 오류가 발생합니다 .js

_LEAVE.prototype._WORK_LIST = function (params) { 
    var Render = function(){ 
     ... 
    } 
} 

내가 뭘 잘못하고 어떻게 해결할 지에 대한 제안은 크게 감사하겠습니다.

+0

중요한 경우. 'render()'는 var로 선언 되었기 때문에 비공개입니다. 원형 인'this.render'가 아닙니다. 그래서 만약 당신이'_LEAVE'에서 접근하려고한다면 당신은 어려움을 겪을 것입니다. – Nucleon

+0

1. 프로토 타입 기반 OOP는 여전히 OOP이지만 클래스는 없습니다. 대신에 "객체 유형"또는 "일종의 객체"라고 말할 수 있습니다. 2. 어떤 코드가 문제를 일으키는 지 짐작하게합니다. 이자형. 당신이 위에서 선언 한 것을 어떻게 부르는 지. 3. 어떤 구현 (JavaScript, JScript, V8, ...)을 사용하고 있습니까? 서버 측 또는 클라이언트 측? – PointedEars

+0

더 많은 코드를 추가해야합니다. 오류를 표시 할만큼 충분하지 않습니다. – Greg

답변

3

이 좋아, 당신은 프로토 타입 기반 상속을 이해하지 못하는 첫째이라면 나는 그것에 대해 당신이 learn을 제안한다. 그것은 실제로 실제로 간단합니다.

둘째, 잘못된 방식으로 사용하지 마십시오. 코드가 나를 몹시 괴롭 힙니다. 나는 당신이 고전적 배경에서 왔음을 이해하며, 당신이하는 노력을 존중합니다. 그러나 진실로 말하면 나는 돈을 받았을지라도 당신의 코드를 읽고 싶지 않을 것입니다.

// baseClass.js 

function BaseClass() {      // class BaseClass 
    var extendedObject = new Extension; 
} 

// extension.js 

Extension.prototype = new BaseClass;   // Extension extends BaseClass 
Extension.prototype.constructor = Extension; // reset the constructor property 

function Extension() {      // class Extension 
    // some private variables 

    var privateVar = null; 
    function privateFunction() {} 

    // some public properties 

    this.publicVar = null; 
    this.publicFunction = function() {}; 
} 

또한 :

내가 (내 프로그램은 당신이 찾고있는하지 어떤 경우 정정 해줘,하지만 난 정말 코드에서 무슨 일이 일어나고 있는지 모른다)했을 것입니다 고전적인 배경을 가졌기 때문에 고전적인 상속 스타일에 맞춰 코드를 작성하는 데 도움이 될 수 있습니다. 이 answer을 읽으십시오. 그것은 당신을 많이 도울 것입니다.

편집 :script을 사용하면 다음과 같이 JavaScript로 클래스를 생성 할 수 있습니다.

baseClass.js

:

/* 
    class BaseClass { 
     var extension; 

     function constructor() { 
      extension = new Extension; 
     } 
    } 
*/ 

var BaseClass = new Class(function() { 
    var extension; 

    function constructor() { 
     extension = new Extension; 
    } 

    return constructor; 
}); 

extension.js :

/* 
    class Extension extends BaseClass { 
     var secret; 

     function constructor() { 
      secret = null; 
     } 

     this.getSecret = function() { 
      return secret; 
     }; 

     this.setSecret = function (newSecret) { 
      secret = newSecret; 
     }; 
    } 
*/ 

var Extension = new Class(function() { 
    var secret; 

    function constructor() { 
     secret = null; 
    } 

    this.getSecret = function() { 
     return secret; 
    }; 

    this.setSecret = function (newSecret) { 
     secret = newSecret; 
    }; 

    return constructor; 
}, BaseClass); 

당신은 fiddle 어설프게 수 있습니다.

+0

제안 해 주셔서 감사합니다. 실제로 프로토 타이핑이 어떻게 작동하는지 이해할 수있었습니다. – phunder

+0

문제 없습니다. 프로그램의 버그를 수정하는 데 도움이되기를 바랍니다. –

0

new으로 인스턴스화하지 않은 경우 thiswindow 개체를 나타냅니다. 대신이 시도 :

var _LEAVE = function() { 
    this.WORK_LIST = new this._WORK_LIST(); 
} 

_LEAVE.prototype._WORK_LIST = function (params) { 
    var Render = function(){ 
     ... 
    } 
} 

console.log(new _LEAVE());