2015-04-03 3 views
3

Недавно я создал свой собственный модуль для node.js для использования с модулем koa. Это модуль перевода, такой как koa-i18n. Я изучил другие модули koa, чтобы узнать, как функции/свойства применяются к контексту/запросу koa, а некоторые из них используют функцию Object.defineProperty, но то, что я сделал в своем модуле, применяло функцию непосредственно к этому.Javascript - Разница между defineProperty и прямое определение функции на объекте

Итак, в чем разница между использованием

Object.defineProperty(app.context, 'getSomeValue', { ... }); 

и

return function* (next) { this.getSomeValue = function() { ... } } 

Я также пришел через модуль узла-делегатов, который использует функцию «применить». Какой из этих методов является предпочтительным способом применения функции/свойства к существующему объекту и каковы плюсы и минусы?

+0

Как правило, нет плюсов и минусов, и никто не является предпочтительным. Все они предназначены для разных целей. Если вы хотите иметь свойство, которое является readonly или которое не перечислимо, вам нужно использовать 'defineProperty'. То же самое с другими методами. Некоторые из них могут быть равны, и вы можете использовать один за другим из-за согласованности. –

+0

Хорошо, поэтому использование 'this.getSomeValue' является read-write и может быть перезаписано другим модулем, который также определяет одно и то же имя свойства в 'this'? – Supercell

+1

То, как вы написали это, является синтаксической ошибкой. Но пока вы не используете 'Object.defineProperty (app.context, 'getSomeValue', {writable: false, value: someValue});' тогда свойство 'getSomeValue'' app.context' может быть перезаписано любым другой код js. Если вам действительно нужно принудительно использовать «writable: false», зависит от ситуации, в большинстве случаев вы будете хотеть делать это только для констант. –

ответ

1

Метод defineProperty имеет определенные преимущества перед непосредственной установкой свойства в объекте или возвратом объекта функции (который каким-то образом может имитировать pesudo-private поля).

Вы можете использовать defineProperty для определения констант, чтобы решить, являются ли они перечислимыми и более.

Здесь вы можете посмотреть выездное обсуждение - when do you use Object.defineProperty().

Также ознакомьтесь с примерами из Mozilla Developer Network для этого метода и конфигураций, чтобы иметь возможность решить, можно ли перезаписывать прописную, перечислимую и т. Д. С помощью свойства define.

Применить немного отличается, и я думаю, что лучшее сравнение было бы с методом вызова JavaScript. Он похож на call с принципиальными отличиями. См. Примечание здесь. Применить и вызвать можно использовать для вызова метода - примерно как отражение на других языках, таких как Java.

Смежные вопросы