Как получить доступ к атрибуту объекта как к переменной? - PullRequest
6 голосов
/ 26 апреля 2011

У меня есть два объекта:

object1={
   type: 'obj1',
   nName: 'nName'
}

object2={
   type: 'obj2',
   pName: 'pName'
}

В моем коде js у меня есть:

object=GET_OBJECT();

Метод GET_OBJECT() возвращает либо object1 , либо object2 , тогда я хотел бы получить доступ к атрибуту name объекта, который является либо nName , либо pName .

Iесть один метод, который получит имя (pName или nName) возвращаемого объекта:

function getName(Object, name){
      return object.name;
}

, где я бы хотел, чтобы name была переменной, чтобы я мог получить доступ к pName илиnName следующим образом:

object=GET_OBJECT();

var name='';

if(object.type=='obj1')
   name='nName';
else
   name='pName';

var finalName=getName(object, name);

Но, похоже, это не сработает, поскольку в:

function getName(Object, name){
          return object.name;
    }

name - переменная. В JS есть ли способ получить доступ к атрибуту как к переменной?

Ответы [ 2 ]

9 голосов
/ 26 апреля 2011

Попробуй так:

function getName(Object, name) {
    return Object[name];
}
0 голосов
/ 17 апреля 2014

Как много раз, прежде чем я удивляюсь, почему люди предоставляют решения, а не знания. В противном случае спрашивающий будет повторять одни и те же ошибки снова и снова.

Исходный код использует функцию для получения атрибута. Предполагается, что можно использовать параметр для вызова параметра. Другими словами, используется нотация Dot, которая должна быть допустимым идентификатором JavaScript. Имя после точки является указателем на содержание. Поэтому getName всегда обращается к имени атрибута, которое, вероятно, не определено.

Показанное решение использует нотацию в скобках, в которой в качестве идентификатора используется содержимое параметра (которое может не существовать), а затем оно разрешает содержимое, и именно поэтому оно действительно работает.

Точечная нотация быстрее и проще для чтения и будет рекомендована, если оба варианта являются допустимыми. Обозначение в скобках должно использоваться, когда вам нужно разрешить во время выполнения. Вот что происходит, когда вы определяете сеттеры и геттеры внутренне. В следующем коде будет использоваться переданная строка, чтобы гарантировать (с помощью скобочной записи), что всякий раз, когда вы используете идентификатор с помощью точечной нотации, будут вызывать переданные функции.

function myClass(){
        //setX and getX should be also defined previous to this
        this.__defineSetter__("x",this.setX);    
        this.__defineGetter__("x",this.getX); 
        //Object.defineProperty can also be used
};

var tObject = new myClass();
tObject.x = 10; //Getter being called
...