Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将一个类嵌套在另一个类中?_Javascript_Class_Nested - Fatal编程技术网

Javascript 如何将一个类嵌套在另一个类中?

Javascript 如何将一个类嵌套在另一个类中?,javascript,class,nested,Javascript,Class,Nested,因此,我正在尝试JavaScript“类”,试图澄清和简化我的一些代码。我拥有的是这样的东西: function action (name, vActor, vTarget) { this.name = name; this.vActor = vActor; this.vTarget = vTarget; this.addRoll = addRoll; this.children = {}; } function addRoll (name, diffMo

因此,我正在尝试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”仍然属于动作类。我还不确定关于启动一个新的空白对象和使用点符号分配内容的语法。提前感谢。

是的,如果从
action
的实例调用了
addRoll
,那么
这个
对象仍然属于
action

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

像这样

function action()
{
...
}

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

var instance = new action();
instance.addRoll();

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

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

像这样

function action()
{
...
}

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

var instance = new action();
instance.addRoll();

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

addRole(...)
属性指向全局
窗口
对象。如果有一个对象
{}
或实例
new Something()
使用函数
addRole
调用
x
,并调用它

x.addRole(...)
属性是
x

附加您已将函数正确分配给动作对象,因此在调用时

var a = new action(...);
然后打电话

a.addRole(...);
属性是您创建的
操作
实例。要防止将其作为全局函数调用并向
窗口添加属性
,可以将其分配给
原型
prototype
对象有一些强大的功能来构建继承,但现在只需更改

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 = {};
}

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

addRole(...)
属性指向全局
窗口
对象。如果有一个对象
{}
或实例
new Something()
使用函数
addRole
调用
x
,并调用它

x.addRole(...)
属性是
x

附加您已将函数正确分配给动作对象,因此在调用时

var a = new action(...);
然后打电话

a.addRole(...);
属性是您创建的
操作
实例。要防止将其作为全局函数调用并向
窗口添加属性
,可以将其分配给
原型
prototype
对象有一些强大的功能来构建继承,但现在只需更改

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 = {};
}

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

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

  • javascript中的“this”指的是什么?
    “this”指函数的调用者。一个简单的例子:
    var newAction=newAction('hello world')
    newAction.addRoll(//…)
    在本例中,addRoll函数中的“this”是“newAction”
    但如果要直接调用“addRoll”,则如果使用浏览器,“this”指的是“Window”对象


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

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

  • javascript中的“this”指的是什么?
    “this”指函数的调用者。一个简单的例子:
    var newAction=newAction('hello world')
    newAction.addRoll(//…)
    在本例中,addRoll函数中的“this”是“newAction”
    但如果要直接调用“addRoll”,则如果使用浏览器,“this”指的是“Window”对象


  • 当您使用
    new
    定义要调用的函数时,请以大写字母开头(记住添加
    new
    ,这是一种惯例),JavaScript中没有“类”;有函数,也有从函数创建的实例。是的,考虑JS中的类并不理想,因为原型比类更强大,我建议学习JavaSctipt方法,而不是尝试模仿其他语言JavaScript不是基于类的编程语言。与尝试将方形块装入圆孔相比,采用其原型范例会做得更好