在创建对象实例时,是否有可能在实例化期间检查传递给构造函数的参数类型,并相应地设置对象的一个变量? 这就是我想要做的事情:
function Test(num1) {
this.num1 = num1;
this.isValidNumber = (function() {
console.log(this.num1); // logs "undefined" upon instantiation
if (isNaN(this.num1)) {
return false;
} else {
return true;
}
}());
}
var testObj = new Test(5);
我希望根据传递给构造函数的参数,isValidNumber的值为true或false。
答案 0 :(得分:3)
您的IIFE(立即调用的函数表达式)会创建一个新的上下文,这意味着this
不再指向您的构造函数,而是指向Window
对象(除非您是'}使用strict mode
使其成为undefined
)。一种可能的解决方案是使用正确的上下文执行此功能:
this.isValidNumber = function() {
if (isNaN(this.num1)) {
return false;
} else {
return true;
}
}.call(this);
答案 1 :(得分:2)
显然更简单的解决方案是:
function Test(num1) {
this.num1 = num1;
this.isValidNumber = !isNaN(this.num1);
}
答案 2 :(得分:0)
这在内部函数中不再引用父对象。存储对象引用的常用方法是创建一个'self'变量,并在它处于正确的范围内时将其赋值给它
function Test(num1) {
var self = this;
this.num1 = num1;
this.isValidNumber = (function() {
console.log(self.num1);
if (isNaN(self.num1)) {
return false;
} else {
return true;
}
}());
}
var testObj = new Test(5);
答案 3 :(得分:0)
首先,代码可以(也可能应该)通过以下方式重写:
function Test(num1) {
this.num1 = num1;
console.log(this.num1);
this.isValidNumber = !isNaN(this.num1);
}
至于您的代码未按预期工作的原因 - 您的自调用函数有自己的this
参数,该参数与构造函数中的this
参数无关。
在这种情况下,自调用函数的this
参数引用全局对象。 (在strict mode
中,它会undefined
)
如果确实需要引用包含函数的this
参数,那么有几种方法可以实现这一点,最简单的方法是:
function Test(num1) {
this.num1 = num1;
var self = this;
this.isValidNumber = (function() {
console.log(self.num1);
return !isNaN(self.num1));
}());
}
在您的特定情况下,您甚至不需要捕捉它,这也会达到同样的效果:
function Test(num1) {
this.num1 = num1;
this.isValidNumber = (function() {
console.log(num1);
return !isNaN(num1));
}());
}
但同样,这里根本不需要自调用函数。