从主类调用javascript原型对象方法

时间:2014-10-13 02:39:41

标签: javascript prototype

var log = function (e, clear) {
  if (clear === true) {
    this.clear();
  }
  console.log(e);
};
log.prototype = {
  clear: function () {
    console.clear();
  }
};
我是这样打来的。

log('hi', true);

它说清楚是不确定的。我也试过log.clear();但同样未定义。

3 个答案:

答案 0 :(得分:3)

我会这样写的

function Log(e, clear) {

  // make `new` optional
  if (!(this instanceof Log)) {
    return new Log(e, clear);
  }

  // clear?
  if (clear === true) {
    this.clear();
  }

  // log
  console.log(e);
}

Log.prototype.clear = function clear() {
  console.clear();
};

答案 1 :(得分:1)

当您调用函数时,如果没有new运算符,this将引用默认的全局对象(在浏览器window对象中),其中未定义clear函数。这就是你得到这个错误的原因。

要使this引用从log构造函数创建的对象,您需要像这样调用它。

new log("Error", true);

现在,JavaScript创建了一个Object,this将引用新创建的对象。当您执行this.clear时,它会首先检查当前对象是否具有clear方法,但它没有。因此,它将通过原型链在log的原型中找到它并且该函数将被执行。

答案 2 :(得分:1)

在错误终止脚本执行时,只需在this.clear()上设置断点,甚至只在控制台中检查this,就会向您显示this未正确设置。

使用new调用构造函数而不是的经典技术是

if (!(this instanceof log)) { return new log(e, clear); }

小点,但clear === true是半冗余的。布尔变量本身就是测试条件,无需与truefalse进行比较。