0

JavaScript で古典的な Java のようなクラスをエミュレートするために、「createClass」という関数があります。

3 つの引数があります。
* 作成するコンストラクタ関数の名前とパス。
* スーパークラスのパス。
* クラスのメソッドを持つ JavaScript オブジェクト。

例えば:

myApp.createClass("myapp.core.JString", "myapp.core.BaseString", {
  abc: function () {
  ...

まず、コンストラクター関数を作成します

Cf = function () {
...

スーパークラスがある場合 ("Base" はスーパークラスのコンストラクター関数です):

protoObj = new Base();
protoObj.constructor = Cf;

次に、新しいクラスのメソッドごとに、それらを protoObj に配置します:
(「protos」は「class」メソッドを持つオブジェクトです)

for (name in protos) {
  ????????????????????
  protoObj[name] = protos[name]

しかし、protoObj にメソッドを配置する前に、上書きされたメソッドからスーパークラス メソッドを呼び出すための便利なメソッドを作成したいと思います。

init: function () {
  this.jstring_super_init();
...

したがって、疑問符がある場所に、次のコードを配置します: (この場合の classnameLast は "jstring" => クラスパスの最後の部分 => 小文字)

if ((typeof protos[name] === "function") && 
    (protoObj[name]) && 
    (typeof protoObj[name] === "function")) {
  supername = classnameLast + "_super_" + name;
  protoObj[supername] = XXXXXXXXXXXXX

複数の X がある場所で、いくつかのことを試しましたが、何も機能しませんでした。上書きされたスーパークラスのメソッドを呼び出す必要があります。

ご協力ありがとうございました

4

2 に答える 2

0

多分あなたはこのようなことをすることができます:

for (name in protos) {
    var super_function = ...; //wherever it comes from
    protoObj[name] = protos[name];
    protos[name]._super = super_function;
}

次に、関数内から、 経由でスーパー関数にアクセスできる必要がありますthis._superthis._super.call(this, ...)スーパー関数が のコンテキストで呼び出されるようにすることもできますthis

うまくいけば、私はあなたを正しく理解しています。また、私が提案できるなら、古典的なオブジェクトと継承を処理するためのより簡単な方法があるかもしれません. Typescript を使用したくない場合は、少なくとも彼らが使用する継承モデルを試してください (これは非常に一般的です)。

http://pastebin.com/Z2kaXqEv

編集: 私を助けたのは、Typescript プレイグラウンド ( http://www.typescriptlang.org/Playground/ ) を使用することでした。それとそれが持つクラス機能をいじって、どのように Javascript にコンパイルされるかを見てください。これは、Javascript で従来の継承を実現する方法を正確に理解するのに役立ちます。

于 2013-03-06T00:38:56.213 に答える
0

XXXXXXXXXXXX に対してこれを試したところ、うまくいきました。

(function(name1, Base1){
  return function() {
    Base1.prototype[name1].apply(this, arguments);                                                                       
  };
})(name, Base);

Firefox 19、Firebug 1.11.2 で「jstring_super_init」関数呼び出しをデバッグしました。

Firebug は非常に奇妙な振る舞いをし、コードの間違った場所にジャンプしました!!

次に、「console.log(this.cid);」を挿入しました。superinit-call の後。

スーパークラスのinitメソッドで「this」につけられるcidがあった!!

Google Chrome バージョン 25 でデバッグすると、正しい関数にジャンプします。

于 2013-03-06T10:43:06.960 に答える