只允许某些类型的属性
问题描述:
function Dude() {
this.firstName = '';
this.lastName = '';
};
var d = new Dude();
d.firstName = 'Ok mr';
d.firstName = 100;
如何防止/防止将100赋值给firstName,以便它始终是一个字符串?分配一个数字,数组另一个对象应该转换为一个字符串。只允许某些类型的属性
答
function Dude() {
this.firstName = '';
this.lastName = '';
Dude.prototype.setFirstName(name) = function() {
if(typeof name != "string") this.firstName = name.toString();
else this.firstName = name;
};
Dude.prototype.setLastName(name) = function() {
if(typeof name != "string") this.lastName = name.toString();
else this.lastName = name;
};
}
var d = new Dude();
d.setFirstName("name");
d.setLastName(100);
这些函数检查名称是否为字符串,如果不是,则名称将被转换为字符串。这意味着它将作为字符串分配给firstName或lastName。
答
试着让这些变量为private,并为它们写getter和setter。在setter中,您可以检查正确的类型。查看this answer检查类型。
function Dude() {
var firstName = '';
var lastName = '';
this.setFirstName = function(name) {
if(typeof name == 'string' || name instanceof String) {
firstName = name;
}
}
this.getFirstName = function() {
return firstName;
}
};
var d = new Dude();
d.setFirstName('Ok mr');
d.setFirstName(100);
console.log(d.getFirstName()); // returns "Ok mr"
但要注意:当您使用的输入元素的值或引用传递的名称将是一个字符串。不管它代表了一个数字还是没有。
+0
谢谢,我想我必须坚持使用这种方法。我正在寻找一种更纯粹的方式来设置和获取没有函数调用的值。 –
是不是更多钞票可言,因为你总是可以重写你的对象实例的任何属性的值。但是,当您尝试使用另一个字符串操作该值时,您的值始终会转换为它们的字符串表示形式,并在内部使用de String()转换函数转换该值。 – jonathansamines
使用getter/setter或使用方法来更改属性并使该属性保密。请参阅http://javascript.crockford.com/private.html了解如何使用私有成员变量来控制对via方法的访问。请记住,JavaScript不是一种类型化的语言,因此解释器不会执行某种类型 - 您必须使用自己的代码来控制对该属性的访问。 – jfriend00
我首先想到了这一点, d.firstName(100),我可以做这个检查,但我无法弄清楚如何在d.firstName()没有()的情况下获得值这只会返回函数。 –