2014-03-26 132 views
0
function Dude() { 
    this.firstName = ''; 
    this.lastName = ''; 
}; 

var d = new Dude(); 
d.firstName = 'Ok mr'; 
d.firstName = 100; 

如何防止/防止将100赋值给firstName,以便它始终是一个字符串?分配一个数字,数组另一个对象应该转换为一个字符串。只允许某些类型的属性

+1

是不是更多钞票可言,因为你总是可以重写你的对象实例的任何属性的值。但是,当您尝试使用另一个字符串操作该值时,您的值始终会转换为它们的字符串表示形式,并在内部使用de String()转换函数转换该值。 – jonathansamines

+1

使用getter/setter或使用方法来更改属性并使该属性保密。请参阅http://javascript.crockford.com/private.html了解如何使用私有成员变量来控制对via方法的访问。请记住,JavaScript不是一种类型化的语言,因此解释器不会执行某种类型 - 您必须使用自己的代码来控制对该属性的访问。 – jfriend00

+0

我首先想到了这一点, d.firstName(100),我可以做这个检查,但我无法弄清楚如何在d.firstName()没有()的情况下获得值这只会返回函数。 –

回答

0
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。

+0

这并不能防止'd.lastName = 100;'这是我认为OP正在寻找的一部分。 – jfriend00

+0

这几乎是不可能的,你必须永远检查,所以这是检查的最好方法 –

+0

这根本不是不可能的。可以在现代浏览器中使用[getters and setters](http://javascriptplayground.com/blog/2013/12/es5-getters-setters/)或kekub的答案和[here](http: //javascript.crockford.com/private.html)。 – jfriend00

2

试着让这些变量为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" 

但要注意:当您使用的输入元素的值或引用传递的名称将是一个字符串。不管它代表了一个数字还是没有。

参考:http://javascript.crockford.com/private.html

+0

谢谢,我想我必须坚持使用这种方法。我正在寻找一种更纯粹的方式来设置和获取没有函数调用的值。 –