2015-06-20 35 views
0

我有一個JavaScript類(使用John Resig's approach),我創建的一個實例,並傳遞一個args對象,像這樣:在JavaScript中,如果它們不存在,我該如何自動將屬性設置爲null?

var myCucumber = new Cucumber({ 
    size: 'small' 
    organic: true 
}) 

在類本身,它引用了args對象的許多屬性。然而,這些屬性都不是強制性的,所以有時可能會有一些缺失的屬性,這會導致「屬性未定義」錯誤。

爲了解決這個問題,我做了以下內容:

args.size = args.size || null; 
args.organic = args.organic || false; 
args.colour = args.colour || null; 
args.origin = args.origin || null; 

這似乎有點討厭不得不爲可能會在整個類中使用的每個屬性做到這一點。

如果在創建類的實例時沒有傳入任何args的屬性將會是null,是否有一種簡潔的方法?

+4

無論你正在使用它,不能你剛纔檢查'undefined'代替,或兩者兼而有之,或這裏有一個瘋狂的想法,只是檢查什麼falsy? – adeneo

+0

如果你確實想要使用這些屬性,只需在它的構造函數中用一些初始值(或者甚至是null)初始化它們即可。 –

回答

2

我建議添加一個函數來以預期的方式處理值。

例子:

Cucumber.prototype._args = function(attr) { 
    return this.args[attr] || null; 
} 

// Then you may use it to access values as follows: 
this._args('size'); 
1

你必須做的一些方法,但是我不會用Resig的方法,因爲它在ES5問題Is John Resig's Javascript inheritance snippet deprecated?

1)(Resig的)創建一個構造函數和值分配給所有不存在的屬性:

var Cucumber = Class.extend({ 
{ 
    init: function(args){ 
    this.size = null; 
    this.organic = false; 
    //etc 
    for (var key in args.keys()) { 
    this[key] = args[key]; 
    } 
    }, 
} 

2)第二個選項使用Object.create與描述。這使您能夠使用默認值創建對象屬性。

// Example where we create an object with a couple of sample properties. 
// (Note that the second parameter maps keys to *property descriptors*.) 
o = Object.create(Object.prototype, { 
    // foo is a regular 'value property' 
    size: { writable: true, configurable: true, value: null }, 
}); 

3)simliarly使用Object.defineProperty

我更喜歡後兩個方面,它因爲我相信這是明確的和更好的使用的Object.create/Object.defineProperty,這裏是對此事的一些其他信息:

http://jaxenter.com/a-modern-approach-to-object-creation-in-javascript-107304.html

Understanding the difference between Object.create() and new SomeFunction()

0

您可以檢查是否有肥胖的在您引用它之前,就已經設置了ject屬性,就像@adeneo所建議的那樣。

如果你的對象有很長的屬性列表,你可以使用@aliasm2k的解決方案。

或者你可以編寫一個對象構造函數並使用它。例如

function ToothPaste(color = null, flavor = null, amount = null){ 
    this.color = color; 
    this.flavor = flavor; 
    this.amount = amount; 
} 

var myTp = new ToothPaste('white'); 
alert(myTp.color); 
alert(myTp.flavor); 
alert(myTp.amount); 
相關問題