在实例化期间使用构造函数变量

Using Constructor variables during the instantiation

是否可以在创建对象实例时在实例化过程中检查传递给构造函数的参数类型,并相应地设置对象变量之一? 这就是我想要做的:

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 的值根据传递给构造函数的参数为​​真或假。

你的 IIFE(立即调用的函数表达式)创建了一个新的上下文,这意味着 this 不再指向你的构造函数而是指向 Window 对象(除非你使用 strict mode 这将使它成为 undefined)。一种可能的解决方案是在正确的上下文中执行此函数:

this.isValidNumber = function() {
    if (isNaN(this.num1)) {
        return false;
    } else {
        return true;
    }
}.call(this);

内部函数中的this不再引用父对象。存储对象引用的一种常见方法是创建一个 '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);

更简单的解决方案显然是:

function Test(num1) {
    this.num1 = num1;
    this.isValidNumber = !isNaN(this.num1);
}

首先,代码可以(并且可能应该)重写如下:

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));
    }());
}

不过,这里根本不需要自调用函数。