扩展日期原型 - 这可能是空的吗?

时间:2016-05-03 17:12:59

标签: javascript

我正在尝试使用JavaScript扩展Date原型:

Date.prototype.toLastDayOfPreviousMonth = function() {
    return new Date(this.getFullYear(), this.getMonth(), 0);
}

但是我不确定我是否可以期望this在这里为空。我的想法是,如果有人想做这样的事情:

var dateA = null;
dateA.toLastDayOfPreviousMonth();

上面的函数永远不会被调用 - 因为我们在null而不是Date上调用它。我对通过应用等调用函数的怪癖不感兴趣。只是'真实'用法date.toLastDayOfPreviousmonth();

我发现的其中一个类似的扩展程序进行了此检查:

var obj = this instanceof Date ? this : null;它有任何意义吗?

1 个答案:

答案 0 :(得分:1)

不是马虎模式。在该模式下,this值必须始终为对象。如果您传递nullundefined原语,this值最终将成为全局对象。

但是,严格模式允许任意值。是的,this可以是null

"use strict";
Date.prototype.toLastDayOfPreviousMonth = function() {
  return this === null;
};
Date.prototype.toLastDayOfPreviousMonth.call(null); // true

如果您不想考虑手动传递自定义this值的方式(例如callapplybindReflect),然后

  • 您不是将该函数作为方法调用,在这种情况下,this将是草率模式下的全局对象,而undefined将是严格模式。
  • 或者您将该函数作为某个对象的方法调用。在这种情况下,this将成为该对象。 null不是一个选项,因为它不是一个对象。
  • 或者您正在将函数作为某种原语的方法来调用,该原语可以包装在对象中。在这种情况下,this将是该对象包装器。 null不是一个选项,因为它不是可以包装对象的。