var log = function (e, clear) {
if (clear === true) {
this.clear();
}
console.log(e);
};
log.prototype = {
clear: function () {
console.clear();
}
};
我是这样打来的。
log('hi', true);
它说清楚是不确定的。我也试过log.clear();但同样未定义。
答案 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
是半冗余的。布尔变量本身就是测试条件,无需与true
或false
进行比较。