2014-03-26 131 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

謝謝,我想我必須堅持使用這種方法。我正在尋找一種更純粹的方式來設置和獲取沒有函數調用的值。 –