express源码分析---merge-descriptors
2024-10-12 11:05:02
在express.js里 我们看到这样的代码:
顾名思义,我们知道是将proto,EventEmitter.prototype 上的属性复制一份给app上。
那它具体实现的原理是怎么样的?
'use strict' /**
* Module exports.
* @public
*/ module.exports = merge /**
* Module variables.
* @private
*/ var hasOwnProperty = Object.prototype.hasOwnProperty /**
* Merge the property descriptors of `src` into `dest`
*
* @param {object} dest Object to add descriptors to
* @param {object} src Object to clone descriptors from
* @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties
* @returns {object} Reference to dest
* @public
*/ function merge(dest, src, redefine) { //dest和src 必须传
if (!dest) {
throw new TypeError('argument dest is required')
} if (!src) {
throw new TypeError('argument src is required')
} //不传默认是true
if (redefine === undefined) { redefine = true
} //遍历src本身所有的属性。不包括它原型上的。
//为什么是所有的。Object.keys() , for....in 都是枚举可枚举的属性
//而Object.getOwnPropertyNames不管可不可枚举都可以取出来 Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { //如果传过来的redefine是true,不管你这个对象本身有没有已经定义这个属性
//都会覆盖! //如果是false,没有才加上!
//而且是原原本本的复制,他会取出描述器,一模一样加上! if (!redefine && hasOwnProperty.call(dest, name)) {
// Skip desriptor
return
} // Copy descriptor
var descriptor = Object.getOwnPropertyDescriptor(src, name)
Object.defineProperty(dest, name, descriptor)
}) return dest
}
最新文章
- 从Eclipse迁移到Android Studio碰到的问题记录
- JavaScript 表单验证
- ABP框架详解(二)AbpKernelModule
- tcp protocol number
- destroy-method=";close";的作用
- BIOS 深入学习 转
- SAP HANA SLT 将Oracle表 数据同步到HANA数据库
- CSS超链接-光标-缩放
- PhpStrom如何安装主题?(总结三种不同格式安装方法)
- fitnesse - Variables and Symbols
- C#进行回文检测,判断字符串是否是回文的代码
- pyspider环境部署2--pyspider安装
- java总结:Java中获取系统时间(年、月、日)以及下拉菜单默认选择系统年、月、日的方法
- PHP-循环结构-数组
- mongoDB的使用(NodeJs)
- 数据连接工具DbVisualizer的使用
- Adroid我还是个菜鸟——导入jar包
- Java如何使用线程异常?
- windows从0开始学golang--0--安装golang+git+自己写包
- notify notifyAll 死锁