Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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_Object_Inheritance_Hash - Fatal编程技术网

如何在Javascript中使用对此的新引用调用父定义块

如何在Javascript中使用对此的新引用调用父定义块,javascript,object,inheritance,hash,Javascript,Object,Inheritance,Hash,如果我在JS中有一个父对象,它将一个块保存到一个键中,我如何在一个嵌套对象中调用它,并正确引用“this” var colors = { foo: function () { return this.color; }, red: { color: 'red', myColor: function () { return foo(); } }, blue: {

如果我在JS中有一个父对象,它将一个块保存到一个键中,我如何在一个嵌套对象中调用它,并正确引用“this”

var colors = {
    foo: function () {
         return this.color;
    },

    red: {  
        color: 'red',
        myColor: function () {
            return foo();
        }
    },

    blue: {
        color: 'blue',
        myColor: function () {
            return foo();
        }
    }
};
这就是我所说的

colors.blue.myColor(); 
输出将是

"blue"
我使用这个想法的确切背景是

    var accounts = {
      checking: {
        balance: 0,
        deposit: function (amount) {
            if (amount > 0) {
                this.balance += amount;
            }
        },
        withdraw: function (amount) {
            var tA = accounts.totalAmount();
            if (amount > 0 && amount <= this.balance) {
                this.balance -= amount;
            } else if (tA >= amount) {
                accounts.savings.withdraw(amount - this.balance);
                this.balance = 0;
            }
        }
      },

      savings: {
        balance: 0,
        deposit: function (amount) {
            if (amount > 0) {
                this.balance += amount;
            }
        },
        withdraw: function (amount) {
            var tA = accounts.totalAmount();
            if (amount > 0 && amount <= this.balance) {
                this.balance -= amount;
            } else if (tA > amount) {
                accounts.checking.withdraw(amount - this.balance);
                this.balance = 0;
            }
        }
      },

      totalAmount: function() {
        return accounts.savings.balance + accounts.checking.balance
      }
    };

在这里,我想把存款功能从储蓄和支票中拉出来,取而代之的是调用block

您是否尝试将值传递给foo

var colors = {
    foo: function (t) {
         return t.color;
    },

    red: {  
        color: 'red',
        myColor: function () {
            return colors.foo(this);
        }
    },

    blue: {
        color: 'blue',
        myColor: function () {
            return colors.foo(this);
        }
    }
};

colors.blue.myColor(); 

您是否尝试过将值传递给foo

var colors = {
    foo: function (t) {
         return t.color;
    },

    red: {  
        color: 'red',
        myColor: function () {
            return colors.foo(this);
        }
    },

    blue: {
        color: 'blue',
        myColor: function () {
            return colors.foo(this);
        }
    }
};

colors.blue.myColor(); 
当您调用myColor时,它将查找名为foo的函数对象,但在其作用域中找不到。因此,它将失败

实际上,您可以在iLife的帮助下定义一个私有的foo函数,并将myColor作为foo的引用,如下所示

var colors = (function() {

    function foo() {
        return this.color;
    }

    return {
        red: {
            color: 'red',
            myColor: foo
        },

        blue: {
            color: 'blue',
            myColor: foo
        }
    }
})();

console.log(colors.blue.myColor());
# blue
console.log(colors.red.myColor());
# red
当您调用myColor时,它将查找名为foo的函数对象,但在其作用域中找不到。因此,它将失败

实际上,您可以在iLife的帮助下定义一个私有的foo函数,并将myColor作为foo的引用,如下所示

var colors = (function() {

    function foo() {
        return this.color;
    }

    return {
        red: {
            color: 'red',
            myColor: foo
        },

        blue: {
            color: 'blue',
            myColor: foo
        }
    }
})();

console.log(colors.blue.myColor());
# blue
console.log(colors.red.myColor());
# red

除非您自己存储一个不能在静态声明中完成的父对象引用,否则无法在javascript中获取父对象引用—它必须通过代码完成。如果没有其他人给您一个父引用,您也无法访问父属性。似乎您最好定义一个类颜色,它有一个字段颜色和函数myColor。@jfriend00如果我想在对象外部调用该函数,比如在单击事件中调用,如何避免重复该函数?我会将其解析为foo函数,然后使用它吗?对不起,我对应该阅读的内容有点迷茫。@NickTho-我们必须看看你的代码到底想实现什么,但我的猜测是,您需要一个更易于使用的不同数据结构。@music_coder我在一个稍微不同的上下文中使用这个想法,其中每个子对象将具有不同的功能,而不仅仅是myColor,但是这些函数中的每一个都必须在某个时候调用foo。除非您自己存储一个不能在静态声明中完成的父对象引用,否则无法在javascript中获取父对象引用—必须使用代码来完成。如果没有其他人给您一个父引用,您也无法访问父属性。似乎您最好定义一个类颜色,它有一个字段颜色和函数myColor。@jfriend00如果我想在对象外部调用该函数,比如在单击事件中调用,如何避免重复该函数?我会将其解析为foo函数,然后使用它吗?对不起,我对应该阅读的内容有点迷茫。@NickTho-我们必须看看你的代码到底想实现什么,但我的猜测是,您需要一个更易于使用的不同数据结构。@music\u coder我在一个稍微不同的上下文中使用这个想法,其中每个子对象将有一个不同的函数,不仅是myColor,而且这些函数中的每一个都必须在某个时候调用foo。是的!谢谢你。我现在觉得我错过了这个太傻了。是的!谢谢你。我现在错过了这个,真是太傻了。谢谢!从现在开始,我将这样构造这些对象,以便正确定义其范围。谢谢!从现在起,我将像这样构造这些对象,以便正确定义其范围。