在实例化期间使用Constructor变量

时间:2015-01-22 09:32:27

标签: javascript 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的值为true或false。

4 个答案:

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

但同样,这里根本不需要自调用函数。