2010-11-28 9 views
0

Ich habe diesen Code:Wie wird auf das erste aufgerufene Objekt verwiesen?

var Person = { 
"name": "", 
"changes": { 
    "name to": function(value) { 
    this["name"] = value; 
    } 
} 
} 

var Josh = Object.create(Person); 
Josh["changes"]["name to"]("John"); 

console.log(Josh.name); // nothing 
console.log(Josh.changes.name); // "John" 

Das Problem ist, dass diese oben bezieht sich auf „Änderungen“ Objekt und nicht die Instanz „Josh“ widersprechen.

Ich kann das nicht durch Person ersetzen, weil es sich dann auf das Objekt "Person" und nicht auf die Objektinstanz "Josh" bezieht.

Kann man sich auf Joshs Namen beziehen?

+0

Für was ist das Objekt "changes"? Es scheint keinen Zweck zu erfüllen. Es wäre natürlicher, eine 'Person.changeName()' Funktion zu haben. –

+0

Dies war nur eine Vereinfachung der tatsächlichen Implementierung. Das Prinzip ist dasselbe. – ajsie

+1

Von einem OO pov, scheint es ein bisschen seltsam. Ein Objekt soll Daten und Methoden einkapseln, um mit diesen Daten zu arbeiten. Sie isolieren Ihre Methoden auf ein anderes Objekt. –

Antwort

2

Warum verwenden Sie nicht die häufigere Form von Javascript OOP?

function Person() { 
    this.name = ""; 
    this.changes = {}; 
    var _this = this; 
    this.changes.nameTo = function(name) { 
     _this.name = name; 
    } 
} 

var Josh = new Person(); 
Josh.changes.nameTo("John"); 

console.log(Josh.name); // "John" 
console.log(Josh.changes.name); // undefined 
0

Leider nicht. Sie haben keinen Verweis auf eine umschließende Instanz des Objekts, in dem Sie sich gerade befinden. Sie müssen die Methode in das äußere Objekt Person verschieben.

var Person = { 
"name": "", 
"changeNameTo": function(value) { 
    this["name"] = value; 
} 
} 

Edit: Wenn Sie unbedingt die ursprüngliche Struktur wollen, wenn auch seltsam aus einer OO-Perspektive. Sie müssen dem inneren Objekt einen Bezug zum Äußeren geben. Programmatisch können Sie es wie folgt tun - oder es vielleicht in einem Konstruktor tun, abhängig von Ihrem Framework, das die Object.create() Methode zur Verfügung stellt.

var Person = { 
"name": "", 
"changes": { 
    "name to": function(value) { 
    this.data["name"] = value; 
    } 
} 
} 

var Josh = Object.create(Person); 
Josh.changes.data = Josh; 

Josh["changes"]["name to"]("John"); 
+0

Ist es nicht möglich Caller/Callee zu verwenden, um das erste Objekt namens Josh ["changes"] ["name to"] ("John") zu erhalten, welches in diesem Fall Josh ist? – ajsie

+0

Ha! Ja, nehme ich an - aber das ist so dunkel, ich hätte es komplett vergessen. Scheint, es ist veraltet sogar http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript –

+0

Weißt du, wie ich Anrufer/Angerufene in meinem Fall verwenden könnte Objekt Josh bekommen? – ajsie

Verwandte Themen