2013-02-13 2 views
1

Как получить родительские параметры?Доступ к родительским свойствам для доступа к Javascript

Я хотел бы получить доступ к глобальным опциям MyObject

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

Как правило, вы не можете сделать это. Но если 'myObject' является глобальным, тогда вы всегда можете выполнять' myObject.options' в дочернем объекте. – freakish

+0

@freakish: Это (слегка расширенное) является * ответом *. –

+0

@ T.J.Crowder Да, на самом деле я не был на 100% уверен, поэтому я решил сделать это замечанием. :) – freakish

ответ

3

Если вы имеете в виду, вы хотите получить доступ к myObject «s options свойства внутри property.propertyMethod, нет никакого способа сделать это, кроме, воспользовавшись тем, что 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

+0

@ user634177: Это зависит от ваших потребностей. Если вам нужен только один из этих объектов, возможно, второй (с использованием функции анонимного производителя). Если вам нужно больше одного, я бы, вероятно, немного реорганизовал и использовал функцию конструктора (но не всем нравится конструкторские функции, версия 'makeObject' тоже прекрасна). –

+0

@ user634177: И, конечно, если вы не против того, чтобы myObject был глобальным, вы можете просто использовать 'myObject', как в первом примере. Если ваше объявление не находится в глобальной области, просто измените его на 'window.myObject =', а не на var myObject =. –

1

Вы можете использовать call связать this с myObject

myObject.property.propertyMethod.call(myObject);

Смежные вопросы