使用 Mongoose 设置 redis 时了解 JS 代码

iRo*_*tia 1 javascript mongoose redis node.js

我试图使用 redis 来理解 NodeJS 中的缓存。

在讲座中,讲师告诉我设置缓存的最佳位置是在 mongoose 中的 exec 函数之前。

所以为了做到这一点,他做了

const mongoose = require('mongoose')

const exec = mongoose.Query.prototype.exec;
//Redis logic
mongoose.Query.prototype.exec = function () {
 console.log("i am here") 
 return exec.apply(this, argument);
}
Run Code Online (Sandbox Code Playgroud)

第一:会分类mongoose.Query.prototype.exec;成什么?值类型还是引用类型?因为如果它是一个引用类型,那么当我们改变时, mongoose.Query.prototype.exec = function它的值不应该也改变吗?

第二,我无法在这里理解这条线return exec.apply(this, argument);有人可以解释这一点,即这适用于哪里?并且他正在传递参数(this, argument);该参数从何而来?

有人可以通过回答上述两个问题来帮助我吗?

Vas*_*san 5

将分类mongoose.Query.prototype.exec; 作为?值类型还是引用类型?因为如果它是一个引用类型那么当我们改变 mongoose.Query.prototype.exec = function

exec是引用类型,但它被分配了另一个引用变量的值mongoose.Query.prototype.exec。你可以这样想:mongoose.Query.prototype.exec本身就是指向内存中的一个对象(一个Function对象),现在赋值之后,exec也是指向同一个对象——也就是说,对象的内存地址被复制了(通过value) from mongoose.Query.prototype.exectoexec在赋值期间。因此,变量mongoose.Query.prototype.exec本身的值,即存储在其中的内存地址,可以在不影响其他变量的情况下进行更改exec。它们最终都会指向两个不同的对象。

有人可以详细解释这一点,即 this in apply 指向哪里?

在这种情况下,它将是调用此函数的对象,即Query实例。

他正在传递参数(this,argument);该参数从何而来?

除非您遗漏了一些代码来复制粘贴问题,否则这argument似乎是一个错字。他可能指的arguments是在每个函数内部都可以访问的内置对象,它由传递给函数的参数组成。这里有一个参考

在较高的层次上,教师试图做的是覆盖函数的内置行为Query.exec()以添加一些他自己的自定义处理。他首先创建原始函数的“备份”,然后将 Query.exec 指向他的自定义函数,该函数添加自定义处理(日志语句),然后将控制权移交给备份,即继续执行内置行为。在此之后调用 Query 实例上的 exec() 的人将看到覆盖的功能 - 首先是日志语句,然后是exec()