2012-11-07 81 views
0

我最近開始使用原型製作項目。這是我第一次使用原型設計,所以仍然找到我的腿:)我來自面向對象的背景,所以如果我的一些術語不正確,請原諒我。調用在基類「class」中的原型函數中聲明的函數:JavaScript原型

我使用它的一個主要原因是爲項目創建一個範圍框架,以避免以後發生任何衝突。我也用它來讓我創建分佈在多個文件上的對象。

然而,我卻遇到了麻煩。

我在一個文件中聲明我的基類「class」。在另一個文件中,我隨後聲明瞭該類的擴展。在這個擴展中,我聲明瞭一個函數,然後我嘗試從基類中調用。最後,我在基類中聲明瞭一個擴展實例,以允許我從基類中調用擴展函數。

當我嘗試和創建實例,但是,我得到以下錯誤:

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

這裏是我的代碼片段:

leave.js

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

工作列表.js

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

關於我在做什麼錯誤以及如何解決它的任何建議將不勝感激。

+0

如果很重要。 'render()'是私有的,因爲它用var聲明,不是'this.render',原型或返回。所以如果你試圖從'_LEAVE'訪問它,你會遇到困難。 – Nucleon

+0

1.基於原型的OOP仍然是OOP,但沒有類;你可以說「對象類型」或「一種對象」。你讓我們猜測哪個代碼導致了這個問題,我。即你如何稱呼你在上面聲明的。 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

如果您還沒有實例化_LEAVEnew,this將引用window對象。試試這個:

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

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

console.log(new _LEAVE());