[英]OOP Javascript parent Object method or Object?
var O = {
elements: {
main: function() { return jQuery("#main"); },
footer: function() { return jQuery("#footer"); }
},
main: function(html) {
return (this.elements.main());
},
style: {
setMaincolor: function() {
// TypeError: Cannot call method 'main' of undefined
return (this.elements.main());
}
}
};
所以; 我是O.style对象的父母对象?
O.style.setMaincolor() // TypeError: Cannot call method 'main' of undefined
O.main() // [<div id="main"></div>]
setMaincolor方法将此返回给O Object
this
是指在其上调用方法的对象。
main()
是在O
对象上调用的,因此this
是对O
的引用。 因此this.elements === O.elements
。
在style
对象上调用setMaincolor()
,因此this
将是对O.style
的引用,该对象没有.elements
属性。
您必须明确定义this
含义。 如果没有指定, this
将指向最近的对象。
您可以像这样创建一个关闭:
var O = (function() {
var self = {
elements: {
main: function() { return jQuery("#main"); },
footer: function() { return jQuery("#footer"); }
}
}
self.style = {
setMaincolor: function() {
return self.elements.main();
}
}
return self;
}());
(function() { ... }());
返回对象,并且self
是只有O
对象知道并且指向其自身的“私有”变量,从而使.elements.main()
引用起作用。
由于setMaincolor
方法是在style
对象内定义的, this
是指style
对象。 由于style
对象没有elements
属性,因此this.elements
是未定义的。
一种解决方案是这样的,您可以显式命名O
对象而不是使用this
:
var O = {
elements: {
main: function() { return jQuery("#main"); },
footer: function() { return jQuery("#footer"); }
},
main: function(html) {
return (this.elements.main());
},
style: {
setMaincolor: function() {
// TypeError: Cannot call method 'main' of undefined
return (O.elements.main());
}
}
};
您不能在setMaincolor
方法中引用this.elements
。 this
指针指向您的样式对象:在O.style.setMaincolor
函数中使用O.elements.main()
代替。
style: {
setMaincolor: function() {
return (O.elements.main());
}
}
尽管我不推荐这种方法,但是请注意,您也可以使用: O.style.setMaincolor.call(O,[]);
这使this
参考O
这就是我要解决的方式:
var O = (function() {
var self = {
elements: {
main: function() { return jQuery("#main"); },
footer: function() { return jQuery("#footer"); }
},
main: function(html) {
return self.elements.main();
},
style: {
setMaincolor: function() {
return self.elements.main();
}
}
};
return self;
}());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.