JavaScript: как динамически определять методы?

#javascript

#javascript

Вопрос:

Object.defineProperty может использоваться для определения свойств и getter / setter или. Но, похоже, он не поддерживает настройку свойств, которые являются функциями (методом). Почему?

 var obj = {};
Object.defineProperty(obj, 'myMethod', function () {
    console.log('Hello!');
})
  

После этого obj.myMethod есть undefined .

Комментарии:

1. Чтение документации всегда полезно.

2. @Teemu Стоит упомянуть, что, несмотря на то, что MDN является очень хорошим источником, его не следует называть «документацией» : любой может редактировать это, например, вики. На некоторых страницах MDN есть ошибки.

3. @GerardoFurtado Да, я в курсе, я внес свой вклад в MDN. Документация MDN JS — это более или менее единственная документация JavaScript , стандарт ECMA Sript — это не совсем документация. Или вы хотите, чтобы я вместо этого написал «RTFM»?

4. @Teemu Да, мы все знаем, что MDN стал фактической документацией, несмотря на ее вики-характер. И нет, я никогда не советую «RTFM» или что-то в этом роде, если только F не означает «долбаный».

Ответ №1:

Третий параметр, который вы передаете Object.defineProperty , должен быть объектом со свойством value, если вы хотите сделать что-то подобное:

 var obj = {};
Object.defineProperty(obj, 'myMethod', { value: function () {
    console.log('Hello!');
}})
obj.myMethod();  

Это приведет к сбою, если вы попытаетесь передать нефункцию:

 var obj = {};
Object.defineProperty(obj, 'myMethod', 'foo')  

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

Ответ №2:

Вы можете использовать этот шаблон:

 var obj = { c: 3 };
obj = Object.assign({}, obj, {
    a: function(){
        console.log("testing");  
    }
});

obj.a();
console.log(obj.c);  

Ответ №3:

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

Помимо этого, вот пример:

 function testMe () {
  var obj = {}
  obj.myFunc = new Function('a', 'b', 'return a   b');
  var el = document.getElementById("test").innerHTML = obj.myFunc(1, 2);
}  
 <div id="test"></div>
<button onclick="testMe();">Try</button>  

Ответ №4:

Прежде чем понять некоторые моменты

Синтаксис : Object.defineProperty(obj, prop, дескриптор)

obj Объект, для которого нужно определить свойство.

укажите имя или символ свойства, которое должно быть определено или изменено.

дескриптор Дескриптор для определяемого или изменяемого свойства.

 const obj = {};

         Object.defineProperty(obj, 'myobject', {
            value: 20,
            writable: false
         });
         obj.myobject = 10;

         document.write(obj.myobject);