2009-10-13 9 views
0

S'il vous plaît regarder mon JavaScript requis.Est-il possible de créer une propriété en JavaScript qui contient des méthodes?

var someVariable = new SomeDataType(); 

// I can directly access value of its property. 
someVariable.someProperty = "test"; 
alert(someVariable.someProperty); // <- this command must should "test" 

// However, I have some methods in above property 

// I want to validate all rule in this property. 
someVariable.someProperty.isValid(); // <- this method will return true/false 

Est-il possible de le faire dans la version actuelle de JavaScript?

MISE À JOUR

S'il vous plaît regarder comme ma réponse!

Répondre

2

Vous ne pouvez pas (et ne devriez probablement pas) traiter des objets comme ceux de JavaScript. Comme quelqu'un d'autre l'a mentionné, vous pouvez remplacer la méthode toString() pour obtenir la moitié de la fonctionnalité (la partie read), mais vous ne pouvez pas utiliser l'opérateur d'affectation sur un objet comme celui-ci sans écraser l'objet.

Vous devez choisir une approche différente, comme l'utilisation d'objets imbriqués (comme suggéré par le CMS).

+0

Je suis d'accord avec cette opinion. –

+1

Puis marquez-le comme la réponse mate;) –

+0

Il existe 2 approches différentes comme Ramesh Vel et je l'ai posté. Remercier. –

0
someVariable.someProperty = [ test, anotherFunc, yetAnotherFunc]; 
someVariable.somePropertyAllValid= function() { 
    for(var prop in someVariable.someProperty) { 
     if(!prop()) return false; 
    } 
    return true; 
}; 

someVariable.somePropertyAllValid(); 
+0

Je ne peux pas le faire parce que j'ai beaucoup de méthode ou propriété à l'intérieur de cette. comme defaultValue, ruleCollection, etc. –

+0

@Soul_Master Si vous voulez dire que vous ne pouvez pas tout ajouter, c'est un tableau de sorte que vous pouvez simplement ajouter les fonctions que vous allez. D'autre part, si vous voulez dire que ceux qui ont des args ou des choses comme ça, vous pouvez définir en ligne ou attribuer à des variables locales ... pls expliquer "Je ne peux pas faire ça ..." – eglasius

+0

D'abord, je dois accéder directement à une certaine valeur de propriété. Deuxièmement, j'ai quelques méthodes et propriétés dans cette propriété. Mais votre réponse ne peut pas résoudre ma question. –

2

Oui, vous pouvez assigner des fonctions Javascript comme des propriétés comme ceci:

someVariable.someProperty = function (arg1, arg2) { 
    // function code goes here 
}; 

Ceci est la méthode à l'aide littéraux de fonction.

Une autre méthode consiste à utiliser des instances de fonction comme ceci:

someVariable.someProperty = new Function (arg1, arg2, code); 

Notez que dans la deuxième méthode, le code va dans comme le dernier paramètre et le mot-clé de fonction a un « F » majuscule contre la méthode 1 où le «f» est petit. De plus, créer une instance de fonction à l'intérieur d'une boucle, etc., créera une nouvelle instance entière à assigner qui est inefficace en mémoire. Ce problème ne se pose pas lors de l'utilisation de la méthode littérale de la fonction.

+0

Je ne comprends pas. Puis-je accéder directement à la valeur someVariable.someProperty? –

+0

Après cela, vous pouvez appeler someVariable.someProperty comme s'il s'agissait d'une fonction. Comme dans var c = someVariable.someProperty (a, b) – notJim

+0

Ce n'est pas mon propos. Votre réponse ne fait que définir la méthode dans l'objet. –

0

Je viens de trouver la réponse. C'est très simple & propre.

function createProperty(value, defaultValue, ruleCollection) 
{ 
    this.value = value; 
    this.defaultValue = defaultValue; 
    this.ruleCollection = ruleCollection;  
} 

createProperty.prototype.toString = function() 
{ 
    return this.value; 
}; 

var someVariable = 
{ 
    someProperty: new createProperty 
    (
     'currentValue', 
     'defaultValue', 
     null 
    ) 
}; 

Pour les tests, vous pouvez utiliser quelque chose comme mon code suivant.

var test = ">>" + someVariable.someProperty + "<<"; 

// this alert must shows ">> currentValue <<" 
alert(test); 


someVariable = 
{ 
    someProperty: new createProperty 
    (
     7, 
     5, 
     null 
    ) 
}; 

test = someVariable.someProperty + 3; 

// This alert must shows "10" 
alert(test); 

Je viens de tester sur FF 3.5 & IE 8. Il fonctionne très bien!

Mise à jour

Oops! Je l'oublie. Parce que cette technique renvoie une référence d'objet pour cette propriété. Il est donc impossible de définir directement les données de propriété. Ce n'est pas ma réponse finale.

2

Il est possible, mais avec le changement ci-dessous dans votre code

function SomeDataType(){ 
    var localProperty=""; 
    this.someProperty = function(txt){ 
     if (arguments.length==0) 
      return localProperty; 
     else 
      localProperty=txt; 
    }  
    this.someProperty.isValid = function(){ 
     return (localProperty!="") ? true : false; 

    }; 
} 

au lieu de définir someProperty comme une propriété, définir ce que la fonction qui fixe la valeur à la propriété locale si une valeur est passée ou il ll revenir cette valeur de propriété si aucun argument n'est donné.

var someVariable = new SomeDataType(); 
someVariable.someProperty("test"); 
alert(someVariable.someProperty()); 

var isValid = someVariable.someProperty.isValid(); 

C'est ainsi que vous devez accéder à l'objet SomeDataType.

+0

Désolé. S'il vous plaît, essayez de regarder ma réponse. –

+0

@Soul_master, je viens de vérifier votre réponse. Je ne trouve nulle part où vous pouvez accéder à isValid de la propriété de someProperty. c'est impossible. C'est pourquoi je vous ai donné cette solution de contournement .. – RameshVel

+0

Je ne pas ajouter dans someProperty parce que le point de ce problème est comment accéder directement à la propriété qui a une certaine propriété interne et une méthode interne. –

0

Ce serait peut-être utile:

var SomeVar = { 
    someProperty : { 
    value : 7, 
    add : function (val) { 
     this.value += parseInt(val, 10); 
     return this; 
    }, 
    toString : function() { 
     return this.value; 
    } 
    } 
} 

alert(SomeVar.someProperty.add(3)); 
Questions connexes