0

最近、あるプロジェクトでプロトタイピングを使い始めました。プロトタイピングを使用するのはこれが初めての 1 つであるため、まだ自分の足を見つけています :) 私はオブジェクト指向のバックグラウンドを持っているため、用語の一部が正しくない場合はご容赦ください。

これを使用する主な理由の 1 つは、プロジェクトのスコーピング フレームワークを作成して、後で競合を回避することです。また、複数のファイルにまたがるオブジェクトを作成できるようにするためにも使用します。

しかし、私は何かに問題があります。

基本「クラス」を 1 つのファイルで宣言します。次に、別のファイルで、クラスの拡張を宣言します。この拡張では関数を宣言し、それを基底クラスから呼び出そうとします。最後に、基本クラス内で拡張機能のインスタンスを宣言して、基本クラスから拡張関数を呼び出せるようにします。

ただし、インスタンスを作成しようとすると、次のエラーが発生します。

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

私が間違っていることとそれを修正する方法についての提案は大歓迎です。

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

_LEAVEでインスタンス化していない場合はnew、オブジェクト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());
于 2012-11-09T03:18:42.540 に答える