Недавно я создал свой собственный модуль для node.js для использования с модулем koa. Это модуль перевода, такой как koa-i18n. Я изучил другие модули koa, чтобы узнать, как функции/свойства применяются к контексту/запросу koa, а некоторые из них используют функцию Object.defineProperty, но то, что я сделал в своем модуле, применяло функцию непосредственно к этому.Javascript - Разница между defineProperty и прямое определение функции на объекте
Итак, в чем разница между использованием
Object.defineProperty(app.context, 'getSomeValue', { ... });
и
return function* (next) { this.getSomeValue = function() { ... } }
Я также пришел через модуль узла-делегатов, который использует функцию «применить». Какой из этих методов является предпочтительным способом применения функции/свойства к существующему объекту и каковы плюсы и минусы?
Как правило, нет плюсов и минусов, и никто не является предпочтительным. Все они предназначены для разных целей. Если вы хотите иметь свойство, которое является readonly или которое не перечислимо, вам нужно использовать 'defineProperty'. То же самое с другими методами. Некоторые из них могут быть равны, и вы можете использовать один за другим из-за согласованности. –
Хорошо, поэтому использование 'this.getSomeValue' является read-write и может быть перезаписано другим модулем, который также определяет одно и то же имя свойства в 'this'? – Supercell
То, как вы написали это, является синтаксической ошибкой. Но пока вы не используете 'Object.defineProperty (app.context, 'getSomeValue', {writable: false, value: someValue});' тогда свойство 'getSomeValue'' app.context' может быть перезаписано любым другой код js. Если вам действительно нужно принудительно использовать «writable: false», зависит от ситуации, в большинстве случаев вы будете хотеть делать это только для констант. –