Javascript`typeof`验证问题

Javascript`typeof`验证问题,javascript,oop,Javascript,Oop,我开始学习JS中的OOP,我遇到了这样一个问题:当validateString返回false时,我的alert()不会触发。我尝试personOne.setFirstName(“”)但不会触发警报() //define Name class function Name () { this.firstName = ''; this.lastName = ''; this.middleName = ''; this.details = { eyeCo

我开始学习JS中的OOP,我遇到了这样一个问题:当
validateString
返回false时,我的
alert()
不会触发。我尝试
personOne.setFirstName(“”)但不会触发
警报()

//define Name class 
function Name () {
    this.firstName = '';
    this.lastName = '';
    this.middleName = '';
    this.details = {
        eyeColor: '',
        hairColor: ''
    }
};

var validateString = function(p) {
    return typeof p != "undefined" && $.trim(p).length;
};

//begin Name methods
Name.prototype.getFullName = function() {
    return this.firstName + ' ' + this.middleName + ' ' + this.lastName;
};
Name.prototype.setFirstName = function(p) {
    if (validateString) {
        this.firstName = p;
    } else {
        alert('Please enter a valid first name.');
    }
};
Name.prototype.setLastName = function(p) {
    if (validateString) {
        this.lastName = p;
    } else {
        alert('Please enter a valid last name.');
    }
};
Name.prototype.setMiddleName = function(p) {
    if (validateString) {
        this.middleName = p;
    } else {
        alert('Please enter a valid middle name.');
    }
};
Name.prototype.setHairColor = function(p) {
    this.details.hairColor = p;
};
Name.prototype.setEyeColor = function(p) {
    this.details.eyeColor = p;
};

//end Name methods

var personOne = new Name();
personOne.setFirstName('John');
personOne.setLastName('Doe');
personOne.setMiddleName('Barry');
personOne.setEyeColor('Brown');
personOne.setHairColor('Black');
document.write(personOne.getFullName());
document.write(personOne.details.eyeColor);
document.write(personOne.details.hairColor);

您需要将参数传递给
validateString

if (validateString(p)) {
  //etc
}
编辑: ... 而且,正如@potenth所提到的,
if
语句被评估为
true
的原因是:

if (myFunc) {
  //blah
}

表示“如果myFunc
作为定义变量存在”。在这种情况下,它与
if(3)
if(true)
相同。在这种情况下,您不需要
验证字符串。考虑

Name.prototype.setFirstName = function(p) {
  this.firstName = p || alert('please enter a first name');
}
这被称为一个。如果未提供任何参数,或参数为空字符串,则将触发警报,并且
this.firstName将未定义。如果需要检查
p`的te长度,请使用:

Name.prototype.setFirstName = function(p) {
  this.firstName = (p && p.trim().length) || alert('please enter a first name');
}

请注意:您可能应该将
validateString()
定义为一个静态
Name
方法;目前,它不是类的一部分,即使许多
Name
方法都需要它。@DavidJohnWelsh实际上使用模块模式的方式很好:)@Jack什么是“模块模式?”我是新来的:)@Etcher我在这里不老,但在这里不完全是新来的(我在这里是中年…?)我也不明白。我确信我只是有点模糊(经常发生:-D),但是模块模式在这里有什么关系呢?谢谢!这是一个新手犯的错误。警报不会触发,因为
validateString
是真实的(它被定义为一个函数,因此
if(validateString)
通过,因为validateString不是null、0或未定义。David您可能需要编辑您的答案,以反映
警报
未触发的原因(因为
if(validateString).
是真实的)是的,但如果将来他想扩展验证例程(只允许某些字符或任何内容),他将需要一个单独的方法来处理它。我认为,由于OP特别尝试学习OOP的做事方式,所以将所有内容划分是一个好主意。