我怎么能把一个类嵌套在另一个类中呢

How can I nest a class within another?

本文关键字:嵌套 另一个 一个 怎么能      更新时间:2023-09-26

所以我正在尝试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;
}

这样做对吗?我的主要问题是关于谁拥有"function addRoll()"部分中的"this"对象。我假设"this"仍然属于动作"class"。我也不确定关于启动一个新的空白对象和使用点符号分配内容的语法。提前谢谢。

忽略函数绑定并调用apply或call,this属性是该方法的所有者。使命感

addRole(...)

this属性指向全局window对象。如果您有一个对象{}或实例new Something(),名为x,函数为addRole,并调用它…

x.addRole(...)

this属性为x

附加您已将函数正确分配给操作对象,因此当您调用。。。

var a = new action(...);

然后打电话给

a.addRole(...);

this属性是您创建的actiona实例。为了防止它被作为全局函数调用并向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 = {};
}

是的,如果从action的实例调用addRoll,则this对象仍将属于action

不过,您的操作方式让我有点困惑,我通常通过构造函数的prototype属性来分配构造函数的方法(您称之为类,但不是真正的)

像这个

function action()
{
...
}
action.prototype.addRoll = function(){...}
var instance = new action();
instance.addRoll();

你在这里问了很多问题,让我试着一次回答一个所以这是你的代码,简化版

function Action (name) {
    this.name = name;
    this.addRoll = addRoll;
}
function addRoll (name, diffMod, dice, success, critSuccess, failure) {
    ...
}
  1. 如何启动一个新的空白对象
    您使用"new"关键字,因此要创建新的"action"对象,请执行var newAction = new Action('hello')

  2. javascript中的"this"指的是什么
    "this"指的是函数的调用方。一个简单的例子:
    var newAction = new Action('hello world');
    newAction.addRoll(//...);
    在这个例子中,addRoll函数内部的"this"是"newAction"
    ,但如果您要直接调用"addRoll",如果您使用浏览器,"this"指的是"Window"对象。