2013-02-13 102 views
1

我如何获得父级选项?Javascript访问父级属性

我想访问

var myObject = {  
    method: function(){ 
    this.options = {}; 
    },  
    property: {  
    propertyMethod: function(){ 
     alert(this.options); 
    }  
    }  
}  
myObject.method(); 
myObject.property.propertyMethod(); 
+3

一般来说,你不能这样做。但是如果'myObject'是全局的,那么你总是可以在子对象中执行'myObject.options'。 – freakish 2013-02-13 16:16:20

+0

@freakish:(稍微扩大)是*答案*。 – 2013-02-13 16:16:50

+0

@ T.J.Crowder是的,其实我并不是100%确定的,所以我决定对它进行评论。 :) – freakish 2013-02-13 16:19:26

回答

3

如果你的意思,你想从property.propertyMethod中访问myObjectoptions财产全球myObject的选项,有没有办法做到这一点,除了采取的事实的优点:这propertyMethod是在myObject变量,例如关闭:

var myObject = {  
    method: function(){ 
    this.options = {}; 
    },  
    property: {  
    propertyMethod: function(){ 
     alert(myObject.options); // <=== Change is here 
    }  
    }  
}  
myObject.method(); 
myObject.property.propertyMethod(); 

...这通常不是一个好主意。 :-)相反,你可能想要以不同的方式设计你的对象。例如:

var myObject = (function() { 
    var obj = { 
    method: function(){ 
     obj.options = {}; 
    },  
    property: {  
     propertyMethod: function(){ 
     alert(obj.options); 
     }  
    }  
    }; 
    return obj; 
})(); 
myObject.method(); 
myObject.property.propertyMethod(); 

这样,您正在使用函数调用的执行上下文。但是如果你打算这么做的话,也许可以采取下一步:

function makeObject() { 
    var obj = { 
    method: function(){ 
     obj.options = {}; 
    },  
    property: {  
     propertyMethod: function(){ 
     alert(obj.options); 
     }  
    }  
    }; 
    return obj; 
} 
var myObject = makeObject(); 
myObject.method(); 
myObject.property.propertyMethod(); 

......所以你可以做多个。甚至使一个真正的构造函数:

function MyObject() { 
    var obj = this; 

    obj.method = function(){ 
    obj.options = {}; 
    };  

    obj.property = {  
    propertyMethod: function(){ 
     alert(obj.options); 
    }  
    }; 
} 
var myObject = new MyObject(); 
myObject.method(); 
myObject.property.propertyMethod(); 

...虽然因为你没有充分利用的原型,也没有太多的理由,使之成为构造函数。

+0

谢谢,这是一个很好的解释,但你会用什么方法? – xavip 2013-02-13 16:49:31

+0

@ user634177:这取决于您的需求。如果你只需要这些对象中的一个,可能是第二个(使用匿名制造商功能)。如果你需要不止一个,我可能会重构一下,并使用构造函数(但不是每个人都喜欢构造函数,'makeObject'版本也不错)。 – 2013-02-13 16:53:03

+0

@ user634177:当然,如果你不介意'myObject'是全局的,你可以像第一个例子那样使用'myObject'。如果您的声明不在全局范围内,只需将其更改为'window.myObject ='而不是'var myObject ='。 – 2013-02-13 17:13:59

1

您可以使用call绑定thismyObject

myObject.property.propertyMethod.call(myObject);