从基类“class”调用原型函数中声明的函数:JavaScript原型

时间:2012-11-07 06:38:54

标签: javascript prototype

我最近开始为项目使用原型设计。这是我第一次使用原型设计,所以仍然找到我的腿:)我来自一个面向对象的背景,所以请原谅我,如果我的一些术语不正确。

我使用它的一个主要原因是为项目创建一个范围框架,以避免以后发生任何冲突。我还使用它来创建分布在多个文件中的对象。

但是我遇到了麻烦。

我在一个文件中声明了我的基类“class”。在另一个文件中,我然后声明该类的扩展。在这个扩展中,我声明了一个函数,然后我尝试从基类调用它。最后,我在基类中声明了一个扩展实例,以允许我从基类调用扩展函数。

但是,当我尝试创建实例时,出现以下错误:

  

SCRIPT445:对象不支持此操作leave.js,第2行   角色5

以下是我的代码片段:

leave.js

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

worklist.js

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

对于我做错了什么以及如何解决它的任何建议都将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您未使用_LEAVE实例化newthis将引用window对象。试试这个:

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

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

console.log(new _LEAVE());