我对JS中的OOP有点新意。我想知道为什么在创建子对象时,这会停止引用第二级子对象之后的主对象。
function Clase()
{
this.__construct = function()
{
this.paginator();
alert('__construct finished');
};
this.paginator = function()
{
this.paginator.title = function()
{
this.paginator.title.set_offsets = function()
{
alert('paginator.title.set_offsets executed!');
};
};
this.paginator.title(); //instantiating
alert('subobject paginator created');
};
this.__construct();
}
var instancia = new Clase();
instancia.paginator.title.set_offsets();
错误是:this.paginator未定义。
现在,如果我使用闭包,它的效果非常好:
function Clase()
{
self = this;
this.__construct = function()
{
this.paginator();
alert('__construct finished');
};
this.paginator = function()
{
self.paginator.title = function()
{
self.paginator.title.set_offsets = function()
{
alert('instancia.paginator.title.set_offsets() executed');
};
};
self.paginator.title();
alert('this.paginator created');
};
this.__construct();
}
var instancia = new Clase();
instancia.paginator.title.set_offsets();
所以,AFAIK经过一段时间后,“这个”停止引用“Clase”这个类并引用别的东西。如果是这样,以这种方式使用闭包是一个好习惯吗?
用self = this开始上课也是正确的;从那时起只使用“自我”?例如:http://jsfiddle.net/byGRX/
答案 0 :(得分:3)
当您嵌套this
时,您将失去对“原始”function
的引用。要解决此问题,请执行以下操作:
function Clase() {
var that = this;
this.paginator = {
title: {
set_offsets: function() {
alert('paginator.title.set_offsets executed!');
}
}
};
};
var foo = new Clase();
foo.paginator.title.set_offsets();
答案 1 :(得分:0)
你不会失去对this
对象的引用,这是发生的事情:
例如:
function Class() {
this.func1 = function () {
this.func1.func2 = function () {
alert('Works!');
};
};
this.func1.func2();
}
x = new Class();
现在,您收到错误消息称func2
不存在的原因是因为func2
的函数对象在您调用func1
之前未构建:
function Class() {
this.func1 = function () {
this.func1.func2 = function () {
alert('Works!');
};
};
this.func1();
this.func1.func2();
}
x = new Class();
现在它有效。
修改强>
那么,为什么这不起作用:
function Class() {
this.func1 = function() {
this.func1.func2 = function() {
this.func1.func2.func3 = function() {
alert('works!');
};
this.func1.func2.property = 5;
};
};
this.func1();
this.func1.func2();
}
x = new Class();
x.func1.func2.func3();
基本上,您要做的是将一个名为property
的属性和一个名为func3
的方法添加到func2
的函数对象中,但问题是func2
在调用func1
之前不构造。这和做的一样:
function Class() {
this.func1 = function() {
this.func1.func2 = function() {};
};
this.func1.func2.func3 = function() {
alert('works!');
};
this.func1.func2.property = 5;
this.func1();
this.func1.func2();
}
x = new Class();
x.func1.func2.func3();
如果你想让它工作,你需要先调用func2
来构建func1
的函数对象:
function Class() {
this.func1 = function() {
this.func1.func2 = function() {};
};
this.func1();
this.func1.func2.func3 = function() {
alert('works!');
};
this.func1.func2.property = 5;
// this.func1.func2();
}
x = new Class();
x.func1.func2.func3();
alert(x.func1.func2.property);