Object.defineProperty
можно использовать для определения свойств и getter
/setter
s. Но, похоже, он не поддерживает настройку свойств, которые являются функциями (методом). Почему?
var obj = {};
Object.defineProperty(obj, 'myMethod', function () {
console.info('Hello!');
})
После этого obj.myMethod
становится undefined
.
@Teemu Стоит отметить, что, несмотря на то, что MDN является очень хорошим источником, его не следует называть "документация": любой может редактировать это, как вики. На некоторых страницах MDN есть ошибки.
@GerardoFurtado Да, я знаю, я внес свой вклад в MDN. Документация MDN JS более или менее единственная Документация по JavaScript, стандарт ECMA Sript не совсем документация. Или вы хотели, чтобы я вместо этого написал "RTFM"?
@Teemu Да, мы все знаем, что MDN стал документацией де-факто, несмотря на его вики-характер. И нет, я никогда не советую «RTFM» или что-то в этом роде, если только F не означает «черт возьми».
Третий параметр, который вы передаете 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>
Чтение документация всегда полезно.