0

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

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

但是,我遇到了一些麻烦。

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

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

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

这是我的代码片段:

离开.js

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

工作清单.js

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

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

4

2 回答 2

3

好吧,首先如果您不了解基于原型的继承,那么我建议您学习一下。其实很简单。

其次,请不要以错误的方式理解这一点——你的代码让我厌恶。我知道你来自古典背景,我尊重你所做的努力。但是,说真的,即使我得到报酬,我也不想阅读您的代码。

这就是我会做的(如果我的程序不是你要找的,请纠正我,但我真的不知道你的代码中发生了什么):

// 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);

你可以摆弄小提琴

于 2012-11-09T05:37:00.793 回答
0

如果您还没有用 实例化_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());
于 2012-11-09T03:18:42.540 回答