我无法弄清楚这里发生了什么。 我知道你必须时不时地将“this”绑定到一个函数来访问它
myclass: {
test: function(){
console.log(this.property);
}.bind(this);
}
我有两个对象father
和child
,我将其扩展为合并所有属性。我将$ .extend与“true”一起使用,以获得深层副本并使用全新的对象以便不修改原始对象。
var father = {
mydata: {
age: 49
},
mymethods: {
showMyAge: function() {
console.log(this.mydata.age);
}
}
};
var child = {
};
var obj = $.extend(true, {}, father, child);
obj.mymethods.showMyAge();
输出
Uncaught TypeError: Cannot read property 'age' of undefined
好的,我说。这是绑定(这个)的事情。非常简单。 所以,我试图添加bind(this)
var father = {
/*...*/
mymethods: {
showMyAge: function() {
console.log(this.mydata.age);
}.bind(this)
}
};
再次
Uncaught TypeError: Cannot read property 'age' of undefined
我试过
obj.mymethods.showMyAge().bind(obj);
同样的错误。 然后我发现如果我把父亲的方法平放到一个级别就行了!
var father = {
/*...*/
mymethods: {
/* moved showMyAge method from here ... */
}
/* to here */
showMyAge: function() {
console.log(this.mydata.age);
}
};
输出正确
49
为什么会这样?当然,这对我来说不是一个解决方案,因为我有一个非常复杂的对象,包含子对象,包含方法。
提前谢谢。
答案 0 :(得分:0)
使用这种方式:
obj.mymethods.showMyAge.call(obj);
或obj.mymethods.showMyAge.apply(obj)
;
apply将参数用作数组:yourFunction.apply(valueForThis, arrayOfArgs);
call需要列出参数:yourFunction.call(valueForThis, arg1, arg2, ...,argN);
答案 1 :(得分:0)
将对象包裹在IIFE(立即调用的函数表达式)中。这会在闭包中创建一个私有变量(that
)。然后,您可以将that
称为父对象。
var father = (function() {
var that = {
mydata: {
age: 49
},
mymethods: {
showMyAge: function() {
console.log(that.mydata.age);
}
}
};
return that;
})();