#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);