accedi all’object genitore in javascript

var user = { Name: "Some user", Methods: { ShowGreetings: function() { // at this point i want to access variable "Name", //i dont want to use user.Name // **please suggest me how??** }, GetUserName: function() { } } } 

Non puoi

Non esiste una relazione ascendente in JavaScript.

Prendi ad esempio:

 var foo = { bar: [1,2,3] } var baz = {}; baz.bar = foo.bar; 

Il singolo object array ora ha due “genitori”.

Quello che potresti fare è qualcosa come:

 var User = function User(name) { this.name = name; }; User.prototype = {}; User.prototype.ShowGreetings = function () { alert(this.name); }; var user = new User('For Example'); user.ShowGreetings(); 
 var user = { Name: "Some user", Methods: { ShowGreetings: function() { alert(this.Parent.Name); // "this" is the Methods object }, GetUserName: function() { } }, Init: function() { this.Methods.Parent = this; // it allows the Methods object to know who its Parent is delete this.Init; // if you don't need the Init method anymore after the you instanced the object you can remove it return this; // it gives back the object itself to instance it } }.Init(); 

Crockford :

“Un metodo privilegiato è in grado di accedere a variabili e metodi privati ​​ed è esso stesso accessibile ai metodi pubblici e all’esterno”

Per esempio:

 function user(name) { var username = name; this.showGreetings = function() { alert(username); } } 

Puoi provare un altro approccio usando una chiusura:

 function userFn(name){ return { Methods: { ShowGreetings: function() { alert(name); } } } } var user = new userFn('some user'); user.Methods.ShowGreetings(); 

Come altri hanno già detto, con un object semplice non è ansible cercare un genitore da un bambino annidato.

Tuttavia, è ansible utilizzare i proxy ES6 ricorsivi come helper.

Ho scritto una libreria chiamata ObservableSlim che, tra le altre cose, ti permette di attraversare da un object figlio al genitore.

Ecco un semplice esempio ( demo di jsFiddle ):

 var test = {"hello":{"foo":{"bar":"world"}}}; var proxy = ObservableSlim.create(test, true, function() { return false }); function traverseUp(childObj) { console.log(JSON.stringify(childObj.__getParent())); // returns test.hello: {"foo":{"bar":"world"}} console.log(childObj.__getParent(2)); // attempts to traverse up two levels, returns undefined because test.hello does not have a parent object }; traverseUp(proxy.hello.foo); 

David Dorward è qui. La soluzione più semplice, tuttavia, sarebbe accedere a user.Name , poiché l’ user è effettivamente un singleton.

Che ne dici di questo modo?

 user.Methods.ShowGreetings.call(user, args); 

Quindi puoi accedere a user.Name in ShowGreetings

 var user = { Name: "Some user", Methods: { ShowGreetings: function(arg) { console.log(arg, this.Name); }, GetUserName: function() { } }, Init: function() { this.Methods.ShowGreetings.call(this, 1); } }; user.Init(); // => 1 "Some user" 

Vecchia domanda ma perché non puoi semplicemente fare qualcosa del genere:

 var user = { Name: "Some user", Methods: { ShowGreetings: function() { // at this point i want to access variable "Name", //i dont want to use user.Name // **please suggest me how??** var thisName = user.Name; //< <<<<<<<< }, GetUserName: function() { } } } 

Perché chiamerai user.Methods.ShowGreetings () solo dopo che l'utente è stato istanziato. Quindi saprai della variabile 'utente' quando vuoi usare il suo nome?

Mi sono imbattuto in questo vecchio post cercando di ricordare come risolvere il problema. Ecco la soluzione che ho usato. Questo è derivato da Pro JavaScript Design Patterns di Harmes and Diaz (Apress 2008) a pagina 8. È necessario dichiarare una funzione e quindi crearne una nuova come mostrato di seguito. Si noti che il metodo Store può accedere a “this”.

 function Test() { this.x = 1; } Test.prototype = { Store: function (y) { this.x = y; }, } var t1 = new Test(); var t2 = new Test(); t1.Store(3); t2.Store(5); console.log(t1); console.log(t2); 
 // Make user global window.user = { name: "Some user", methods: { showGreetings: function () { window.alert("Hello " + this.getUserName()); }, getUserName: function () { return this.getParent().name; } } }; // Add some JavaScript magic (function () { var makeClass = function (className) { createClass.call(this, className); for (key in this[className]) { if (typeof this[className][key] === "object") { makeClass.call(this[className], key); } } } var createClass = function (className) { // private var _parent = this; var _namespace = className; // public this[className] = this[className] || {}; this[className].getType = function () { var o = this, ret = ""; while (typeof o.getParent === "function") { ret = o.getNamespace() + (ret.length === 0 ? "" : ".") + ret; o = o.getParent(); } return ret; }; this[className].getParent = function () { return _parent; }; this[className].getNamespace = function () { return _namespace; } }; makeClass.call(window, "user"); })(); user.methods.showGreetings();