I have two answers, one using your current JSON model, and the other in a more Javascript manner.
A.
When you define Thing like so.
var Thing = {
'property':{
'one':5,
'two':3
},
'action':(function(arg1, arg2){
alert(arg1 + ' ' + arg2);
return this.property.one + this.property.two;
})
}
you create a literal, meaning that each time you execute code such as
var t = Thing;
You pass by reference and do not create a new object in memory. Thus using more than one variable referring to Thing will create problems.
Additionally, your problem spews form the fact that the keyword this is found at runtime and usually refers to the browser window unless specified by the bind command. Keep in mind it must always be an object. The nature of a literal is such that it does not change the this variable in layman's terms.
B.
Now to address this problem in a better fashion. Instantiatable objects, or classes as you said, are created like any other function. However they are instantiated by the keyword new. In order to use their own reference, the this keyword represents the most derived instantiatable class in the current scope. Thus your example is better written as so
var Thing = function(){
this.property = {};
this.property.one = 5;
this.property.two = 3;
this.action = function Action(arg1, arg2){
alert(arg1 + ' ' + arg2);
return this.property.one + this.property.two;
}
}
var t = new Thing();
alert(t.action('x', 'y'));
I hope that helps.
Furthermore
You said
I'm looking for is someway to "reach back up the tree"
While I'm not quite sure what you mean I'm inferring that if what I've said thus far doesn't help that you mean you have objects inside objects. For example, suppose you have a Student class that also contains a Schedule class. You may want to access student data from the schedule class. While this example is poor because by design, the Schedule instance shouldn't need to access Student data and if it needs to, it ought to be passed via function parameter, you can work through this as well.
function Student(age){
this.age = age;
this.schedule = new Schedule(this);
}
function Schedule(parent){
this.getAge = function(){return parent.age;}
}
var s = new Student(16);
s.schedule.getAge();
You could simply pass the parent object into the instances of the children and accomplish the, backing up the tree as you said.