簡體   English   中英

從基本“類”調用原型函數中聲明的函數:JavaScript原型

[英]Calling a function declared in the prototype function from the base “class”: JavaScript prototyping

我最近開始為項目使用原型。 這是我第一次使用原型,所以仍然發現我的雙腿:)我來自面向對象的背景,因此,如果我的某些術語不正確,請原諒。

我使用它的主要原因之一是為項目創建一個范圍界定框架,以避免以后出現任何沖突。 我還使用它來創建分布在多個文件中的對象。

但是我遇到了麻煩。

我在一個文件中聲明我的基本“類”。 然后在另一個文件中,聲明該類的擴展。 在此擴展中,我聲明一個函數,然后嘗試從基類中調用該函數。 最后,我在基類中聲明一個擴展實例,以允許我從基類中調用擴展函數。

但是,當我嘗試創建實例時,出現以下錯誤:

SCRIPT445:對象不支持此操作leave.js,第2行字符5

這是我的代碼片段:

離開

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

worklist.js

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

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

好吧,首先,如果您不了解基於原型的繼承,那么我建議您學習一下。 實際上,這真的很簡單。

其次,請不要以錯誤的方式處理此問題-您的代碼讓我討厭。 我了解您來自古典背景,並且尊重您所做的努力。 但是,說實話,即使我付了錢,我也不想閱讀您的代碼。

這就是我要做的(如果我的程序不是您想要的程序,請更正我,但我真的不知道您的代碼中正在發生什么):

// 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 () {};
}

此外,由於您來自古典背景,因此可以幫助您編寫更符合古典繼承樣式的代碼。 閱讀此答案 它將對您有很大幫助。

編輯:使用我的腳本,您可以按照以下方法在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);

您可以修補小提琴

如果你還沒有實例化_LEAVEnewthis將涉及window對象。 嘗試以下方法:

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

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

console.log(new _LEAVE());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM