Как получить доступ к свойству функции объекта javascript, используя переменную - PullRequest
1 голос
/ 07 января 2020

Здравствуйте, рассмотрите код ниже

 let test={
    a:function(){
      console.log('Hi')
    }
  }

Есть ли способ вызвать свойство 'a' с помощью переменной?

Это работает,

 let test={
    a:function(tmp){
      console.log(tmp)
    }
  }
let functn='a';  
test[functn]("hello");

но в любом случае можно вызвать такой же код, как показано ниже:

 let test={
    a:function(){
      console.log('Hi')
    }
  }
let functn='a("hello")';  
test.function;

Фактический вариант использования:

Это Вопрос, связанный с тестом системы транспортиров,

У меня есть родительский объект с css locator [id = 1], а у дочерних элементов есть локаторы [id = 1]> div, [id = 1]> span et c.

, поэтому в настоящее время родительский элемент сохраняется как

let parent = element(by.css('[id=1']) , 

child как

let child1= element(by.css('[div]') 

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

element(by.css('[id=1']).element(by.css('[div]')

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

parent.child1

Ответы [ 6 ]

1 голос
/ 07 января 2020

Был в состоянии заставить это работать, я преобразовываю все в строку и вызываю это, используя функцию eval:

     let test={
        a:function(tmp){
          document.write(tmp)
        }
      }
    let functn='a("hello")';
    eval(Object.keys({test})[0]+'.'+functn) 
1 голос
/ 07 января 2020

Это работает,

Да, это так. Сделайте это.

, но в любом случае можно вызвать такой же код, как показано ниже:

No.

let functn=a("hello"); вызывает функцию в переменной a и присваивает его возвращаемое значение functn.

Если предположить, что это не дает сбоя (поскольку a не объявлено), тогда test.function просматривает значение свойства с именем function (который не имеет ничего общего с только что объявленной переменной function) для объекта, хранящегося в test, и ничего с ним не делает.

0 голосов
/ 07 января 2020

Вы можете изменить свой подход на один, не используя eval, взяв массив ключей и параметров и функцию, которая принимает ключ и параметр и вызывает функцию объекта.

let call = ([key, parameter]) => test[key](parameter),
    test = {
        a: function(tmp) { console.log(tmp); }
    },
    parameters = ['a', 'hello'];

call(parameters);
0 голосов
/ 07 января 2020

Сначала вы передаете строку, которая не обязательна, если вы не принимаете никаких параметров. Что вы можете сделать, это использовать getters .

Документация: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/get

let test={
   get a (){
     console.log('Hi')
   }
}

Таким образом, каждый раз, когда вы пытаетесь получить доступ к a , он будет выполняться и, таким образом, будет печатать вас «Привет» в вашей консоли.

test.a;
0 голосов
/ 07 января 2020

Если вы ищете раствор для карри:

 let test={
    a:function(str){
      return () => console.log(str)
    }
  }
let functn=test.a("hello");  
functn();
0 голосов
/ 07 января 2020

Есть и более простая форма кода

// Using Function Arrow
let test = (message => 'Hello World!')()

console.log(test)

// Using factory function

let data = function() {
    return {
        nome:'Jack'
    }
}

console.log(data())
console.log(Object.values(data()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...