开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10天,点击查看活动详情
上一次掘金的征文活动,准确来说,应该是去年的最后一次掘金官方的征文活动,我没有参加那一次征文活动。距离上一次征文,好像有两三个月了,感觉时间过得有点漫长了,都快要忘记掘金的征文活动了。
现在掘金推出了新的一年的征文活动-掘金日新计划 · 2 月更文挑战
,又要开始新的一年,新的一轮的征文挑战了。
征文挑战已经开始了,而我即将要参与这次征文活动,参与挑战,挑战自己。
提升系列
提升系列,我主要是想写一些平时工作上面,自己会用到的一些好的技巧或者方法。当然,这些技巧和方法是针对我自己的。
除此之外,还可能会写一些解决难点的方法。比如,遇到了某个难点,要通过什么方法来解决它?
正如它的名字一样--提升
,通过学习一些好的技巧、方法,或者解决一些难题、难点,来提升我们的能力。
出这个提升系列,一方面,是提升自己的开发能力;另一方面,也希望这个提升系列,可以帮助到部分人,提升他们的开发能力。
在这个系列里,我能想到的或者实现方法,不一定是最好的。欢迎大家一起来参与讨论,有好的想法也可以告诉我一下。
前言
在上一篇文章里,我们介绍了到momentjs源码里面的Duration
构造函数。我们分析了Duration
构造函数的一些逻辑,它在new Duration实例对象时,进行相关的处理以及属性赋值,然后返回这个实例化对象。
现在对Duration构造函数里,调用到方法进行分析一下。
实现
我们先在vscode里面搜索一下Duration方法,查找了一会,找到了Duration方法的定义:
function Duration(duration) {
var normalizedInput = normalizeObjectUnits(duration),
years = normalizedInput.year || 0,
quarters = normalizedInput.quarter || 0,
months = normalizedInput.month || 0,
weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
days = normalizedInput.day || 0,
hours = normalizedInput.hour || 0,
minutes = normalizedInput.minute || 0,
seconds = normalizedInput.second || 0,
milliseconds = normalizedInput.millisecond || 0;
this._isValid = isDurationValid(normalizedInput);
// representation for dateAddRemove
this._milliseconds =
+milliseconds +
seconds * 1e3 + // 1000
minutes * 6e4 + // 1000 * 60
hours * 1000 * 60 * 60;
this._days = +days + weeks * 7;
this._months = +months + quarters * 3 + years * 12;
this._data = {};
this._locale = getLocale();
this._bubble();
}
我们可以看到,在Duration构造函数的最开始,就调用了一个叫做normalizeObjectUnits
的方法。
该方法的作用是什么呢?
我们点击该方法,进行跳转到其函数定义的位置
function normalizeObjectUnits(inputObject) {
var normalizedInput = {},
normalizedProp,
prop;
for (prop in inputObject) {
if (hasOwnProp(inputObject, prop)) {
normalizedProp = normalizeUnits(prop);
if (normalizedProp) {
normalizedInput[normalizedProp] = inputObject[prop];
}
}
}
return normalizedInput;
}
我们可以看到,normalizeObjectUnits函数的代码非常少,比Duration构造函数的代码还要少。
好,我们就分析一下normalizeObjectUnits函数里的代码逻辑:
1.先是定义了几个变量:normalizedInput,normalizedProp,prop
2.遍历传递进来的参数inputObject,调用hasOwnProp方法进行判断
如果属性是inputObject对象自身的属性,而不是来自其原型或原型链上的属性,那么条件满足,进行逻辑 处理。
调用normalizeUnits,对对象的属性进行处理。如果对象的属性是string类型,返回对应数据;如果不是, 则返回undefined
3.处理后的对象属性还有值,把对应的值赋值给normalizedInput
4.最后返回normalizedInput
我们可以看到,主要是对传递进来的对象属性做一些处理,然后返回处理后的对象
小结
本篇文章总结:
本小节主要是分析了Duration构造函数里,调用到的normalizeObjectUnits函数。该函数主要是对传递进来的对象,做一些属性处理,然后返回。
如果大家有疑问,也可以自己到源码里查看一下。欢迎大家沟通交流。
最后,放上自己比较喜欢的一句诗句:
千淘万漉虽辛苦,吹尽狂沙始到金 - 唐 刘禹锡《浪淘沙》