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

Javascript 在实例化期间使用构造函数变量,javascript,instantiation,Javascript,Instantiation,在创建对象实例时,是否可以在实例化过程中检查传递给构造函数的参数类型,并相应地设置对象的一个变量? 这就是我想做的: function Test(num1) { this.num1 = num1; this.isValidNumber = (function() { console.log(this.num1); // logs "undefined" upon instantiation if (isNaN(this.num1)) {

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

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。

您的IILife立即调用函数表达式将创建一个新上下文,这意味着它不再指向构造函数,而是指向Window对象,除非您使用的是strict模式,这将使其未定义。一种可能的解决方案是使用正确的上下文执行此函数:

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

IIFE立即调用的函数表达式创建了一个新的上下文,这意味着它不再指向构造函数,而是指向窗口对象,除非您使用的是严格模式,这将使其未定义。一种可能的解决方案是使用正确的上下文执行此函数:

this.isValidNumber = function() {
    if (isNaN(this.num1)) {
        return false;
    } else {
        return true;
    }
}.call(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);

内部函数中的此项不再引用父对象。存储对象引用的一种常见方法是创建一个“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;
    this.isValidNumber = !isNaN(this.num1);
}

首先,代码可以也可能应该以以下方式重写:

function Test(num1) {
    this.num1 = num1;

    console.log(this.num1);
    this.isValidNumber = !isNaN(this.num1);
}
至于代码没有按预期工作的原因,您的自调用函数有自己的this参数,它与构造函数中的this参数无关。 在这种情况下,自调用函数的this参数引用全局对象。在严格模式下,它是未定义的

如果确实需要引用包含函数的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));
    }());
}

但是,这里也不需要自调用函数。

首先,代码可以也可能应该按照以下方式重写:

function Test(num1) {
    this.num1 = num1;

    console.log(this.num1);
    this.isValidNumber = !isNaN(this.num1);
}
至于代码没有按预期工作的原因,您的自调用函数有自己的this参数,它与构造函数中的this参数无关。 在这种情况下,自调用函数的this参数引用全局对象。在严格模式下,它是未定义的

如果确实需要引用包含函数的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));
    }());
}

但是,这里也不需要自调用函数。

这不是您认为的内部函数。内部函数可以直接引用外部num1函数参数,也可以在使用.bind、.call或.apply调用内部函数时进行适当设置。注意,您也可以通过简单地说return来删除if/else块!伊斯南。。。;在立即调用的函数表达式中使用的函数是全局作用域。这是一个窗口,没有属性num1。这不是您认为的内部函数。内部函数可以直接引用外部num1函数参数,也可以在使用.bind、.call或.apply调用内部函数时进行适当设置。注意,您也可以通过简单地说return来删除if/else块!伊斯南。。。;在立即调用的函数表达式中使用的函数是全局作用域。这是一个窗口,并没有属性num1。若这只是OP代码的一个简化版本呢?你们会想要的!isNaNthis.num1here@Scimonster我只是指出了这个例子的最佳解决方案。完全有可能OP消失在这里的杂草中,看不到森林而看不到树木。一句话里有很多谚语。你说得对,德克塞,我迷路了,你的解决方案是最简单的,谢谢。我确实从这里的答案中学到了一些关于“这个”范围的知识,谢谢。@Derpanel-在我看来,这也是最正确的。请务必记住,函数内部的代码在调用时将执行。这甚至可以被分解成你最初的if语句。如果isNaNthis.num1{this.isValidNumber=false;}或者{this.isValidNumber=true;}如果这只是OP代码的简化版本呢?你会想要的!isNaNthis.num1here@Scimonster我只是指出了这个例子的最佳解决方案。完全有可能OP消失在这里的杂草中,看不到森林而看不到树木。在一句话里有很多谚语,你是李
我迷路了,你的解决方案是最简单的,谢谢。我确实从这里的答案中学到了一些关于“这个”范围的知识,谢谢。@Derpanel-在我看来,这也是最正确的。请务必记住,函数内部的代码在调用时将执行。这甚至可以被分解成你最初的if语句。如果isNaNthis.num1{this.isValidNumber=false;}否则{this.isValidNumber=true;}这两个函数都不引用。在外部函数中,这是指新创建的对象;在内部函数中,这将是假定在浏览器中运行或未定义的窗口,具体取决于代码是否处于严格模式。这两个函数都不适用。在外部函数中,这是指新创建的对象;在内部函数中,这将是假定在浏览器中运行或未定义的窗口,这取决于代码是否处于严格模式。+1,因为这是正确的解决方案,但如果您解释为什么会这样做,而不仅仅是代码转储,那就好了。抱歉,我不熟悉堆栈溢出,还不习惯正确的操作方式:编辑答案,谢谢+1因为这是正确的解决方案,但是如果你解释一下为什么这样做,而不仅仅是一个代码转储,那就更好了。对不起,我对堆栈溢出还不熟悉,还不习惯正确的处理方式:编辑了答案,谢谢!你的回答概括了我需要知道的一切,谢谢!你的回答概括了我需要知道的一切,谢谢!