Javascript - defineProperty 和直接在对象上定义函数的区别

Javascript - Difference between defineProperty and directly defining a function on an object

我最近为 node.js 创建了自己的模块,用于 koa 模块。它是一个类似 koa-i18n 的翻译模块。我研究了其他 koa 模块以了解如何将 functions/properties 应用于 koa context/request 并且其中一些使用 Object.defineProperty 函数,但我在模块中所做的是直接应用函数在 'this'.

那么,使用

有什么区别呢?
Object.defineProperty(app.context, 'getSomeValue', { ... });

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

我也遇到过使用 'apply' 函数的节点委托模块。 以下哪种方法是将 function/property 应用于现有对象的首选方法,优缺点是什么?

defineProperty 方法比直接在对象中设置 属性 或返回函数对象(在某些方面可以模拟伪私有字段)具有特定优势。

您可以使用 defineProperty 定义常量来决定它们是否可枚举等等。

您可以在此处查看类似的讨论 - when do you use Object.defineProperty()

也请查看 Mozilla Developer Network 中的示例以了解此方法,以及使用 define 属性.

确定 prop 是否可写、可枚举等的配置

Apply 有点不同,我认为更好的比较是 JavaScript 调用方法。它与 call 相似,主要是原理图不同。请参阅此处的注释。 Apply 和 Call 可用于调用方法 - 大致类似于 Java.

等其他语言中的反射