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

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

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

После этого obj.myMethod становится undefined.

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

Teemu 09.04.2019 12:54

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

Gerardo Furtado 09.04.2019 12:56

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

Teemu 09.04.2019 13:18

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

Gerardo Furtado 09.04.2019 13:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
74
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

Синтаксис: Object.defineProperty(obj, prop, descriptor)

объект Объект, для которого определяется свойство.

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

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

const obj = {};

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

         document.write(obj.myobject);

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

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

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>

Другие вопросы по теме