1

そこで、JavaScriptの「クラス」を試して、コードの一部を明確にし、単純化しようとしています。私が持っているのは次のようなものです:

function action (name, vActor, vTarget) {
    this.name = name;
    this.vActor = vActor;
    this.vTarget = vTarget;
    this.addRoll = addRoll;
    this.children = {};
}
function addRoll (name, diffMod, dice, success, critSuccess, failure) {
    this.children[name] = {} ;
    this.children[name].diffMod = diffMod;
    this.children[name].dice = dice;
    this.children[name].success =       {condition: success,        outcome: {}};
    this.children[name].critSuccess =   {condition: critSuccess,    outcome: {}};
    this.children[name].failure =       {condition: failure,        outcome: {}};
    this.children[name].addSuccess = addSuccess;
    this.children[name].addFailure = addFailure;
    this.children[name].addOutcome = addOutcome;
}

これはこれについて行く正しい方法ですか?私の主な質問は、「関数addRoll()」セクションの「this」オブジェクトの所有者に関するものです。「これ」はまだアクション「クラス」に属していると思います。また、新しい空白のオブジェクトを開始し、ドット表記を使用してものを割り当てることに関する構文もわかりません。前もって感謝します。

4

3 に答える 3

1

関数のバインドを無視し、applyまたはcallを呼び出すと、thisプロパティはメソッドの所有者になります。呼び出しています...

addRole(...)

プロパティはグローバルオブジェクトthisを指します。関数で呼び出されwindowたオブジェクト{}またはインスタンスがあり、それを呼び出した場合...new Something()xaddRole

x.addRole(...)

thisプロパティはですx

追加関数をアクションオブジェクトに正しく割り当てたので、呼び出したときに...

var a = new action(...);

そして、

a.addRole(...);

thisプロパティは、作成したインスタンスaですaction。グローバル関数として呼び出されてプロパティを追加するのを防ぐために、にwindow割り当てることができますprototypeprototypeオブジェクトには、継承を構築するためのいくつかの強力な機能がありますが、今のところは単に変更するだけです...

addRole(...) {...}

次へ...

action.prototype.addRole = function(...) {...}

そして、実行中の割り当てを削除します...

this.addRole = addRole

所有者なしで関数が誤って呼び出されるのを防ぎます

さらに、addRoleで子を割り当てる方法を書き直して、オブジェクトリテラル表記をさらに活用することができます...

function addRoll(name, diffMod, dice, success, critSuccess, failure) {
    this.children[name] = {
        diffMod: diffMod,
        dice: dice,
        success: {
            condition: success,
            outcome: {}
        },
        critSuccess: {
            condition: critSuccess,
            outcome: {}
        },
        failure: {
            condition: failure,
            outcome: {}
        },
        addSuccess: addSuccess,
        addFailure: addFailure,
        addOutcome: addOutcome
    };
}

次のように、子のクラスを使用するようにコードをリファクタリングすることもできます。

function Action(name, vActor, vTarget) {
    this.name = name;
    this.vActor = vActor;
    this.vTarget = vTarget;
    this.children = {};
}
Action.prototype.addRoll = function(name, role) {
    this.children[name] = role;
}

function Role(diffMod, dice, success, critSuccess, failure) {
    this.diffMod = diffMod;
    this.dice = dice;
    this.success = success;
    this.critSuccess = critSuccess;
    this.failure = failure;
}
Role.prototype.addSuccess = function(...) {...}
Role.prototype.addFailure = function(...) {...}
Role.prototype.addOutcome = function(...) {...}

function Condition(condition) {
    this.condition = condition;
    this.outcome = {};
}
于 2012-09-08T00:05:10.477 に答える
0

ええ、addRollのインスタンスから呼び出された場合actionthisオブジェクトは引き続きに属しactionます。

あなたのやり方は私には少し混乱しますが、私は通常、コンストラクターのメソッド(クラスと呼んでいますが、実際にはそうではありません)をそれらのprototypeプロパティを介して割り当てます

このような

function action()
{
...
}

action.prototype.addRoll = function(){...}

var instance = new action();
instance.addRoll();
于 2012-09-07T23:57:48.000 に答える
0

あなたはここでかなりの数の質問をしました、一度に一つずつ答えてみようと思いますので、これはあなたのコード、簡略化されたバージョンです

function Action (name) {
    this.name = name;
    this.addRoll = addRoll;
}
function addRoll (name, diffMod, dice, success, critSuccess, failure) {
    ...
}
  1. 新しい空白のオブジェクトを開始する方法は?
    「新しい」キーワードを使用するので、新しい「アクション」オブジェクトを作成するには、var newAction = new Action('hello')

  2. 「これ」はJavaScriptで何を指しますか?
    「これ」は、関数の呼び出し元を指します。簡単な例:
    var newAction = new Action('hello world');
    newAction.addRoll(//...);
    この例では、addRoll関数内の「this」は「newAction」
    ですが、「addRoll」を直接呼び出す場合、ブラウザを使用している場合、「this」は「Window」オブジェクトを指します。

于 2012-09-08T00:07:54.797 に答える