में गुणों और नामकरण सम्मेलनों को परिभाषित करना मैं एक अच्छा जावास्क्रिप्ट प्रोग्रामर रहा हूं और द्वारा सूचीबद्ध coding conventions का पालन करता हूं। हालांकि तब से जावास्क्रिप्ट विकसित हुआ है और मेरा मानना है कि नामकरण सम्मेलन अब पुराने हैं।जावास्क्रिप्ट
उदाहरण के लिए Crockford ने कहा:
का प्रयोग न करें
_
(underbar) एक नाम के पहले अक्षर के रूप में। कभी-कभी गोपनीयता को इंगित करने के लिए इसका उपयोग किया जाता है, लेकिन यह वास्तव में गोपनीयता प्रदान नहीं करता है। अगर गोपनीयता महत्वपूर्ण है, तो उन फॉर्मों का उपयोग करें जो private members प्रदान करते हैं। उन सम्मेलनों से बचें जो क्षमता की कमी का प्रदर्शन करते हैं।
हालांकि जावास्क्रिप्ट अब आपको गैर-गणना योग्य गुण बनाने की अनुमति देता है। इसलिए यह समझ में आता है कि (कम से कम मेरे लिए - आपको असहमत होने की अनुमति है) एक अंडरबार के साथ गैर-संख्यात्मक गुणों को उपसर्ग करने के लिए यह इंगित करने के लिए कि संपत्ति गैर-गणना योग्य है।
आपको ऐसा क्यों करना चाहिए?
- क्योंकि visual feedback is important (लिंक किए गए आलेख में पठनीयता अनुभाग तक स्क्रॉल करें)।
- पिछड़ा संगतता। आप उन गुणों को फ़िल्टर कर सकते हैं जो
for in
लूप में अंडरबार से शुरू होते हैं।
की क्या Crockford कहा की एक और उदाहरण लेते हैं:
वैश्विक चर सभी बड़े अक्षरों में होना चाहिए। मैं इसे देखना वहाँ के रूप में इन नियमों का पालन के साथ दो समस्याएं हैं (JavaScript मैक्रो या स्थिरांक नहीं है, इसलिए वहाँ ज्यादा रुचिकर स्थानों जावास्क्रिप्ट नहीं है कि सूचित करने के लिए कि सभी बड़े अक्षरों का प्रयोग करने में नहीं है।)
:
- अधिकांश जावास्क्रिप्ट प्रोग्रामर सभी कैप्स में वैश्विक चर नहीं लिखते हैं। यह सिर्फ प्राकृतिक नहीं है।
- जावास्क्रिप्ट अब आपको गैर-लेखन योग्य गुण बनाने की अनुमति देता है। इसलिए, इस तरह के गुणों के लिए सभी कैप्स का उपयोग उसी कारण से किया जाता है जैसा कि मैंने उपरोक्त गुणों के लिए ऊपर बताया है।
सब कुछ ठीक है और ठीक है, लेकिन असली सवाल आप से पूछना क्या है? Object.defineProperties
फ़ंक्शन देखें। समस्या यह है कि आपको प्रत्येक संपत्ति के लिए एक संपत्ति डिस्क्रिप्टर की आपूर्ति करने की आवश्यकता है जिसे आप परिभाषित करना चाहते हैं। यह भी verbose है। उदाहरण के लिए: के रूप में निम्नानुसार
var o = {}, x = 0;
define(o, {
E: Math.E,
get x() {
return x;
},
set x(y) {
x = y;
}
});
define
समारोह परिभाषित किया जाएगा:
var define = (function() {
var defineProperty = Object.defineProperty;
var has = Function.call.bind(Object.hasOwnProperty);
var getDescriptorOf = Object.getOwnPropertyDescriptor;
return function (obj, props) {
for (var key in props)
if (has(props, key))
defineProperty(obj, key,
getDescriptorOf(props, key));
};
}());
लेकिन अब आप कर सकते हैं '
var o = {}, x = 0;
Object.defineProperties(o, {
E: {
value: Math.E,
enumerable: true,
configurable: true
}
x: {
enumerable: true,
configurable: true,
get: function() {
return x;
},
set: function (y) {
x = y;
}
}
});
इसके बजाय यह अगर आप बस कर सकता है ज्यादा बेहतर होगा टी non-enumerable
, non-configurable
या non-writable
आसानी से संपत्ति बनाते हैं।इसलिए मैं define
समारोह संशोधित इस प्रकार है:
var define = (function() {
var defineProperty = Object.defineProperty;
var has = Function.call.bind(Object.hasOwnProperty);
var getDescriptorOf = Object.getOwnPropertyDescriptor;
return function (obj, props) {
for (var key in props) {
if (has(props, key)) {
var descriptor = getDescriptorOf(props, key);
if (key.charAt(0) === "_")
descriptor.enumerable = false;
if (key.charAt(key.length - 1) === "_")
descriptor.configurable = false;
if (has(descriptor, "value") && key === key.toUpperCase())
descriptor.writable = false;
defineProperty(obj, key, descriptor);
}
}
};
}());
अब एक underbar के साथ शुरुआत गुण गैर गणनीय कर रहे हैं, एक underbar के साथ समाप्त होने के गुण जो नहीं है गैर विन्यास और डेटा वर्णनकर्ता गुण किसी भी लोअरकेस अक्षरों गैर कर रहे हैं -writable।
तो मेरा सवाल यह है - क्या क्रॉकफोर्ड के नामकरण सम्मेलनों का पालन करते हुए संपत्तियों को गैर-गणनीय, गैर-कॉन्फ़िगर करने योग्य या गैर-लिखने योग्य बनाने का कोई तरीका है? मुझे पता है कि मेरे नामकरण सम्मेलनों में अधिक योग्यता है। हालांकि मैं क्रॉकफोर्ड के सम्मेलनों को जल्दबाजी से त्यागना नहीं चाहता हूं।
यह इसी प्रकार है: http://stackoverflow.com/questions/4484424/underscore-prefix-for-property-and-method-names-in-javascript –