Можно ли создать в JavaScript какое-либо свойство, содержащее несколько методов?

Пожалуйста, посмотрите на мой необходимый JavaScript.

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

Возможно ли это сделать в текущей версии JavaScript?

ОБНОВИТЬ

Пожалуйста, посмотрите как мой ответ!

13.10.2009 04:33:05
6 ОТВЕТОВ
РЕШЕНИЕ

Вы не можете (и, вероятно, не должны) обрабатывать такие объекты в JavaScript. Как уже упоминалось, вы можете переопределить метод toString (), чтобы получить половину функциональности (часть чтения), но вы не можете использовать оператор присваивания для такого объекта без перезаписи объекта.

Вы должны выбрать другой подход, например, использовать вложенные объекты (как предложено CMS).

2
13.10.2009 04:47:23
Есть 2 разных подхода, таких как Рамеш Вел, и я опубликовал это. Поблагодарить.
Soul_Master 14.10.2009 10:17:34
someVariable.someProperty = [ test, anotherFunc, yetAnotherFunc];
someVariable.somePropertyAllValid= function() {
   for(var prop in someVariable.someProperty) {
      if(!prop()) return false;
   }
   return true;
};

someVariable.somePropertyAllValid();
0
13.10.2009 04:45:38
Я не могу сделать это, потому что у меня есть много методов или свойств внутри этого. как defaultValue, ruleCollection и т. д.
Soul_Master 13.10.2009 04:42:00
@Soul_Master, если вы имеете в виду, что вы не можете добавить туда все, это массив, так что вы можете просто добавлять функции по ходу дела. С другой стороны, если вы имеете в виду, что у них есть аргументы или тому подобное, вы можете определить в строке или присвоить локальным переменным ... пожалуйста, объясните "Я не могу этого сделать ..."
eglasius 13.10.2009 04:44:32
Во-первых, мне нужно напрямую получить доступ к значению someProperty. Во-вторых, у меня есть некоторые методы и свойства в этом свойстве. Но твой ответ не может решить мой вопрос.
Soul_Master 13.10.2009 05:25:40

Да, вы можете назначить функции Javascript как свойства:

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

Это метод, использующий функциональные литералы.

Другой метод заключается в использовании экземпляров функций, подобных этому:

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

Обратите внимание, что во втором методе код входит как последний параметр, а ключевое слово Function имеет заглавную букву «F» по сравнению со способом 1, где «f» мало.

Кроме того, создание экземпляра функции внутри цикла и т. Д. Создаст целый новый экземпляр для назначения, который неэффективен в памяти. Эта проблема не возникает при использовании метода литерал функции.

2
13.10.2009 04:38:54
Я не понимаю Могу ли я напрямую получить доступ к значению someVariable.someProperty?
Soul_Master 13.10.2009 04:45:56
После этого вы можете вызвать someVariable.someProperty, как если бы это была функция. Как в var c = someVariable.someProperty (a, b)
davidtbernal 13.10.2009 05:05:28
Это не моя точка зрения. Ваш ответ - только установка метода в объект.
Soul_Master 13.10.2009 05:43:48

Я только что нашел ответ. Это очень просто и чисто.

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
    )
};

Для тестирования вы можете использовать что-то вроде моего следующего кода.

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);

Я просто тестирую его на FF 3.5 и IE 8. Он отлично работает!

Обновить

К сожалению! Я забыл об этом. Потому что этот метод возвращает ссылку на объект для этого свойства. Таким образом, невозможно напрямую установить данные свойства. Это не мой окончательный ответ.

0
13.10.2009 05:16:44

Это возможно, но с приведенным ниже изменением в вашем коде

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;

    };
}

вместо определения someProperty как свойства, определите это как функцию, которая устанавливает значение в локальное свойство, если передано какое-либо значение, или оно вернет значение этого свойства, если аргумент не указан.

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

var isValid = someVariable.someProperty.isValid();

это то, как вам нужно получить доступ к объекту SomeDataType.

2
13.10.2009 05:11:42
Сожалею. Пожалуйста, попробуйте посмотреть на мой ответ.
Soul_Master 13.10.2009 05:21:16
@ Soul_master, я только что проверил твой ответ. я нигде не могу найти доступ к isValid свойства someProperty. это невозможно. вот почему я дал вам этот обходной путь ..
RameshVel 13.10.2009 05:24:31
Я не добавляю в someProperty, потому что суть этой проблемы заключается в том, как напрямую получить доступ к свойству, которое имеет некоторое внутреннее свойство и некоторый внутренний метод.
Soul_Master 13.10.2009 08:49:28
+1 Ваш ответ - еще один способ решить этот вопрос. Однако для получения и установки этого ответа используйте метод для этого. Но мой вопрос хочу использовать его как собственность.
Soul_Master 13.10.2009 08:54:49

Возможно, это поможет:

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));
0
13.10.2009 11:07:52