mimic-fn
作用
将源函数的所有属性复制到目标函数上
使用
const mimicFn = require('mimic-fn');
function A() {
}
function B() {
}
mimicFn(B, A);
// 将A函数的属性复制给B函数
源码学习
源码就一段代码
module.exports = (to, from) => {
for (const prop of Reflect.ownKeys(from)) {
Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
}
return to;
};
// 使用ES6方法Reflect.ownKeys(object)获取全部属性
// 使用Object.defineProperty(obj, prop, descriptor)设置属性
Reflect.ownKeys
Reflect.ownKeys返回对象的所有属性,基本等于Object.getOwnPropertyNames及Object.getOwnPropertySymbols之和
对于函数A:
Reflect.ownKeys(A) // 含有[ 'length', 'name', 'arguments', 'caller', 'prototype' ]
Reflect.ownKeys 阮一峰教程
Object.defineProperty(obj, prop, descriptor)
定义对象属性的描述符
descriptor有以下属性:
-
configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。 -
enumerable
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
数据描述符同时具有以下可选键值: -
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。 -
writable
当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false。
存取描述符同时具有以下可选键值: -
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。
默认为 undefined。 -
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
默认为 undefined。
Object.defineProperty()官方文档
优点:
- 可以复制函数的属性到另一个函数,方便使用
不足:
- 不能复制实例属性,例如
function A() {
this.type = 'function';
}
// type是不能被复制的
- 复制为浅拷贝,如果属性值为引用类型,则可能会引发问题
const mimicFn = require('mimic-fn');
function A() {}
A.types = [ 1, 2 ];
function B() {}
mimicFn(B, A);
A.types.push(3);
console.log(B.types); // [1,2,3]
Mongoose
在使用mongoose遇到的问题,mongoose版本为5.0.18
Schema
new mongoose.Schema({
createDate: {
type: Date,
default: Date.now,
get() {
},
set() {
}
}
}, options);
// 在Schema中使用getter和setter,需要在options中加入如下属性
{
toObject: { getters: true },
toJSON: { getters: true },
// 自动更新创建时间和更新时间,默认为createdAt和updatedAt,可以通过如下方式修改字段
timestamps: {
createdAt: 'createTime',
updatedAt: 'updateTime',
},
}