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
。