Javascript`typeof`验证问题
我开始学习JS中的OOP,我遇到了这样一个问题:当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
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的做事方式,所以将所有内容划分是一个好主意。