JavaScript原型问题

JavaScript原型问题,javascript,Javascript,如果我调用myRobot.Speak.sayHi()它总是返回undefined。拜托,我做错什么了?谢谢回复 var Factory = (function() { // Constructor var Robot = function() { }; // Public return { extendRobot: function(power, methods) { Robot.prototype[pow

如果我调用
myRobot.Speak.sayHi()
它总是返回
undefined
。拜托,我做错什么了?谢谢回复

var Factory = (function() {

    // Constructor  
    var Robot = function() {

    };

    // Public
    return {
        extendRobot: function(power, methods) {
            Robot.prototype[power] = methods;
        },
        createRobot: function() {
            return new Robot();
        }
    };

}());

Factory.extendRobot('Speak', {
    sayHi: function() {
        return 'Hi, ' + this.name;
    }
});

var myRobot = Factory.createRobot();
myRobot.name = 'Robin';
myRobot.Speak.sayHi() // => ‘Hi, Robin’

myRobot.Speak.name='Robin'


在您的情况下,
指的是
Robot.Speak
,而不是父对象
Robot

myRobot.Speak.name='Robin'


在您的情况下,
指的是
机器人。说话
,而不是父对象
机器人

行之前插入
名称:this.name
sayHi:function(){
之前插入
名称:this.name
,然后它应该工作

createRobot: function() {
    var r = new Robot();
    for (var k in r.Speak) {
        if (typeof r.Speak[k] === "function") {
            r.Speak[k] = r.speak[k].bind(r);
        }
    }
    return r;
}
而不是返回一个新的机器人,确保绑定所有的方法在你的权力机器人

要避免循环中的硬编码,请尝试以下操作:

Robot.powers = [];
...
extendRobot: function(power, methods) {
    Robot.powers.push(power);
    Robot.prototype[power] = methods;
},
createRobot: function() {
    var robot = new Robot();
    Robot.powers.forEach(function(power) {
        for (var method in robot[power]) {
            if (typeof robot[power][method] === "function") {
                robot[power][method] = robot[power][method].bind(robot);
            }
        }
    });
    return robot;
}
这取决于使用或用于支持旧浏览器(即 而不是返回一个新的机器人,确保绑定所有的方法在你的权力机器人

要避免循环中的硬编码,请尝试以下操作:

Robot.powers = [];
...
extendRobot: function(power, methods) {
    Robot.powers.push(power);
    Robot.prototype[power] = methods;
},
createRobot: function() {
    var robot = new Robot();
    Robot.powers.forEach(function(power) {
        for (var method in robot[power]) {
            if (typeof robot[power][method] === "function") {
                robot[power][method] = robot[power][method].bind(robot);
            }
        }
    });
    return robot;
}

这取决于使用或用于支持旧浏览器(如果您不返回任何内容,则该方法返回
undefined
。在这种情况下,这根本不是问题。@ThiefMaster修复了…仍然不变。如果您不返回任何内容,则该方法返回
undefined
。在这种情况下,这根本不是问题。@ThiefMaster修复了…仍然不变。感谢您的回复!我应该使用
apply或
调用
?但是…我想从
myRobot.Speak.sayHi
访问变量
myRobot.name
:-|这是可能的吗?@Emmitt:是的,这是可能的,但可能会使您的代码更复杂一些。谢谢您的回复!我应该使用
应用
还是
调用
?但是…我想访问变量
myRobot.name
来自myRobot.Speak.sayHi
:-|这可能吗?@Emmitt:是的,这可能会让你的代码更复杂一些。不可能,因为
这个.name
在调用
Factory.extendRobot时会引用
工厂。name
会引用
窗口。name
不,不会,因为调用
Factory.extendRobot时,
此.name
将引用
Factory.name
窗口.name