2012-08-21 4 views
7

JSHintの検査では、JavaScriptのマジックナンバーを知ることができました。JavaScriptのマジックナンバーの使用を避ける - JsHintで動作する代替語

私はこの試みた:

var constants = { 
    millisecs: 1000, 
    secs: 60 
}; 

もこの:

var constants = function() { 
    this.millisecs = 1000; 
    this.getMillisecs = function() { 
     return this.millisecs; 
    }; 
}; 

JsHintは両方文句を。

罰金作品もののthis answerから解決策を取る:おそらくクロージャの

var constants = (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    this.getMillisecs = function() { return millisecs; }; 
    this.getDefaultMsgsPerSecond = function() { return defaultMsgsPerSecond; }; 
})(); 

を。これはなぜ受け入れられるのですが、別のSOの質問から得られた他の2つの提案は受け入れられません。

編集:エラーは発生しませんが、実際には機能しません。定数が定義されていないというエラーは定義されていません。 JsFiddle

は明確にするために、 - 「作品」で私が意味する、あなたの編集について

+0

一つの問題は明らかにあなたの最初の2つのコード例で表示されるが、後者のコード例では不足している、「定数」という一定ではないということです - 、それは '定数と(コードで後で変更することができます.millisecs = 100; ')。 – penartur

+0

@penarturは答えとして私を襲っています - 実際の例はすぐにそのプロパティをプライベートにし、2つのgetterだけが公開されています。 – bcmcfc

+0

@ Wouter-Huysentruitあなたの編集内容を教えてください。 – bcmcfc

答えて

3

「JsHintから警告をトリガしません」

は、私はあなたがnewにインラインオブジェクトたかったのだと思う:

var constants = new (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    this.getMillisecs = function() { return millisecs; }; 
    this.getDefaultMsgsPerSecond = function() { return defaultMsgsPerSecond; }; 
})(); 

でも、JSHintはこれについて文句を言うでしょう:Weird construction. Is 'new' unnecessary?

クロージャーとして使用する場合は、実際に何かを返す必要があります。そうでない場合、には実際にundefinedが含まれます。簡単な修正はthisを返すことですが、あなたが所有していないオブジェクトのインスタンスであるthisを拡張しているため、それは悪い解決策になります。 ECMAScriptの6では

var constants = (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    return { 
     getMillisecs: function() { return millisecs; } 
     getDefaultMsgsPerSecond: function() { return defaultMsgsPerSecond; } 
    }; 
})(); 
4

、あなただけ行うことができます::

だから、インラインオブジェクトは、ここで解決策であるように思わ戻っ

const MILLISECS = 1000; 
const DEFAULT_MSG_PER_SECOND = 60; 

しかし、それまで、あなたが使用することができますECMAScriptの5のObject.freeze:

var constants = { 
    millisecs: 1000, 
    defaultMsgPerSecond: 60 
}; 

var constants = Object.freeze(constants); 

// Now constants is in fact... a constant! 
constants.millisecs = 999; 
constants.millisecs; // Still === 1000 

そして、それは冗長であるためにあなたの自然のならば、あなたはObject.definePropertiesを試すことができます。

var constants = {}; 

Object.defineProperties(constants, { 
    'millisecs': { 
     value: 1000, 
     writable: false 
    }, 
    'defaultMsgPerSecond': { 
     value: 60, 
     writable: false 
    }, 
}); 

// Again, constants is in fact... a constant! 
constants.millisecs = 999; 
constants.millisecs; // Still === 1000 
関連する問題