2011-01-01 16 views
4

Ich versuche, eine Objektmethode aus einer Objektdefinition (das gleiche Objekt) ohne Erfolg aufzurufen.Aufrufen einer Objektmethode aus einer Objekteigenschaftsdefinition

var objectName = { 
    method : function() { 
      return "boop"; 
    }, 
    property : this.method() 
}; 

In diesem Beispiel möchte ich den Rückgabewert von objectName.method ("boop") zu objectName.property zuzuweisen.

Ich habe versucht objectName.method(), method(), window.objectName.method(), zusammen mit der Klammer Notation Varianten von all denen auch, ex. this["method"], ohne Glück.

+0

I 'Eigentum' ein Verfahren ändern könnte: method2: function() {return this.method(); } aber ich möchte das vermeiden, da der Inhalt nicht dynamisch sein wird. – Ian

+0

Dynamische Eigenschaften gibt es in keiner aktuellen Version von JavaScript. – PatrikAkerstrand

+0

Ich meine, dass der Wert der Eigenschaft nach der Initialisierung nicht geändert werden muss. – Ian

Antwort

5

Bei der Initialisierung this auf das Objekt bezieht sich nicht die Eigenschaft hält method (die noch nicht initialisiert ist), sondern auf den curent Kontext - und da dies keine method Eigenschaft hat, werden Sie eine Typeerror erhalten.

Wenn es eine benutzerdefinierte Sie wollen, dann könnten Sie in Getter und Setter in Javascript untersuchen - sie werden nicht von ECMAscript vor ES5 unterstützt, aber viele Engines support them nonetheless.

-1

Würden Sie einfach nicht gehen:

var objectName = { 
    method : function() { return "boop"; }, 
    property : function() { return this.method(); } 
}; 
+0

In Ihrem Code ist "Eigenschaft" eine Funktion, nicht der Rückgabewert von Methode(). –

1

Ich sehe keinen Grund, warum Sie würde dies tun wollen?

Warum nicht einfach einen Getter verwenden, wenn Sie den Methodennamen nicht verwenden möchten.

var objectName = { 
    method : function() { 
     return "boop"; 
    }, 
    property : function() { 
     return this.method(); 
    } 
}; 
+0

Ich denke, es löst die Frage nicht. Sie müssen noch objectName.property() als Funktion aufrufen, Sie können objectName.property nicht ausführen, um den Wert selbst zu erhalten. –

0
/* overwrites the `property` function with a the set value 
* the first time it's called. From then on it's just a 
* property 
*/ 
var objectName = { 
    method: function(){ return 'boo'; }, 
    property: function(){ 
     var returnValue = this.method(); 
     this.property = returnValue; 
     return returnValue; 
    } 
}; 

/* or */ 
var objectName = { 
    property: (function(){ return 'boo'; }()); 
}; 
/* this evaluates the anonymous function within 
* the parenthetical BEFORE the definition of 
* objectName leaving only the returned value 
* to be set to property 
*/ 

/* or */ 

var objectName = { 
    method: function(){ 
     this.property = 'boop'; 
     return this.property; 
    } 
} 
/* calling the method to create/set the property 
* for objectName to the evaluated value 
*/ 

/* or */ 

var objectName = { 
    data: { 
     property: 'boop' 
    }, 
    property: function(value){ 
     if (value) this.data.property = value; 
     return this.data.property; 
    } 
}; 

/* the last one, I believe, is a neat way of handling 
* both set and get stealing the concept from my use 
* with JQuery. 
* set = objectName.property('boo'); 
* get = objectName.property(); 
*/ 
+1

In all Ihren Beispielen ist "Eigenschaft" eine Funktion, nicht der Wert selbst. –

0

Eine weitere Möglichkeit, dies zu tun:

var objectName = { 
    method : function() { 
     return "boop"; 
    } 
}; 

$.extend(objectName, { 
    property : objectName.method() 
}) 

ObjektName bereits zum Zeitpunkt initialisiert der Aufruf 'Methode'.

0

Es funktionierte für mich wie folgt:

var objectName = { 
    method : function() { 
      return "boop"; 
    }, 
    property : objectName.method() 
}; 
Verwandte Themen