2018年9月28日(周五)

mimic-fn

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',
    },
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值