हैक्स हैक्स हैक्स कर रहे हैं, लेकिन शायद यह एक में थोड़ा और अधिक दूसरों की तुलना में खूबसूरत है, के बाद से वाक्य रचना बुला और तुम क्या चाहते करने के समान होगा
var instance1 = MyClass.build(["arg1","arg2"]);
var instance2 = new MyClass("arg1","arg2");
: एक वस्तु का निर्माण करने के
Function.prototype.build = function(parameterArray) {
var functionNameResults = (/function (.{1,})\(/).exec(this.toString());
var constructorName = (functionNameResults && functionNameResults.length > 1) ? functionNameResults[1] : "";
var builtObject = null;
if(constructorName != "") {
var parameterNameValues = {}, parameterNames = [];
for(var i = 0; i < parameterArray.length; i++) {
var parameterName = ("p_" + i);
parameterNameValues[parameterName] = parameterArray[i];
parameterNames.push(("parameterNameValues." + parameterName));
}
builtObject = (new Function("parameterNameValues", "return new " + constructorName + "(" + parameterNames.join(",") + ");"))(parameterNameValues);
}
return builtObject;
};
अब आप इनमें से किसी कर सकते हैं: आप बिल्कुल मूल वर्गों को संशोधित करने की जरूरत नहीं होगी 0
दी, कुछ समारोह वस्तु के प्रोटोटाइप को संशोधित करने की तरह नहीं हो सकता है, तो आप इसे इस तरह से करते हैं और बदले में एक समारोह के रूप में उपयोग कर सकते हैं:
function build(constructorFunction, parameterArray) {
var functionNameResults = (/function (.{1,})\(/).exec(constructorFunction.toString());
var constructorName = (functionNameResults && functionNameResults.length > 1) ? functionNameResults[1] : "";
var builtObject = null;
if(constructorName != "") {
var parameterNameValues = {}, parameterNames = [];
for(var i = 0; i < parameterArray.length; i++) {
var parameterName = ("p_" + i);
parameterNameValues[parameterName] = parameterArray[i];
parameterNames.push(("parameterNameValues." + parameterName));
}
builtObject = (new Function("parameterNameValues", "return new " + constructorName + "(" + parameterNames.join(",") + ");"))(parameterNameValues);
}
return builtObject;
};
और फिर आप यह इतना की तरह कहेंगे:
var instance1 = build(MyClass, ["arg1","arg2"]);
तो, मुझे उम्मीद है कि वे किसी के लिए उपयोगी हैं - वे आपको मूल कन्स्ट्रक्टर फ़ंक्शंस अकेले छोड़ने और कोड की एक साधारण पंक्ति में बाद में प्राप्त करने की अनुमति देते हैं (वर्तमान में चयनित समाधान/वर्कअराउंड के लिए आपको आवश्यक दो लाइनों के विपरीत ।
प्रतिक्रिया का स्वागत है और सराहना की जाती है।
अद्यतन: नोट करने के लिए एक दूसरी बात - इन विभिन्न तरीकों के साथ एक ही प्रकार के उदाहरण बनाने और फिर अगर उनके निर्माता गुण ही कर रहे हैं देखने के लिए जाँच करने का प्रयास - आपको लगता है कि अगर आप कभी भी मामला हो सकते हैं किसी ऑब्जेक्ट के प्रकार की जांच करने की आवश्यकता है। क्या मेरा मतलब है सबसे अच्छा निम्नलिखित कोड के रूप में रेखांकित किया गया है:
function Person(firstName, lastName) {
this.FirstName = firstName;
this.LastName = lastName;
}
var p1 = new Person("John", "Doe");
var p2 = Person.build(["Sara", "Lee"]);
var areSameType = (p1.constructor == p2.constructor);
अन्य हैक्स से कुछ के साथ कि कोशिश करो और देखो क्या होता है। आदर्श रूप में, आप उन्हें एक ही प्रकार के बनना चाहते हैं।
चेतावनी: जैसा कि टिप्पणी में बताया गया है, यह उन निर्माता कार्यों कि अज्ञात फ़ंक्शन सिंटैक्स का उपयोग बनाई गई हैं के लिए काम नहीं करेगा, यानी
MyNamespace.SomeClass = function() { /*...*/ };
जब तक आप उन्हें इस प्रकार बना:
MyNamespace.SomeClass = function SomeClass() { /*...*/ };
ऊपर प्रदान किया गया समाधान आपके लिए उपयोगी हो सकता है या नहीं भी हो सकता है, आपको समझना होगा कि आप ar के लिए क्या कर रहे हैं अपनी विशेष जरूरतों के लिए सबसे अच्छे समाधान पर चले जाओ, और आपको मेरा समाधान "काम" करने के लिए क्या हो रहा है इसके बारे में जानने की आवश्यकता है। यदि आप समझ नहीं पाते कि मेरा समाधान कैसे काम करता है, तो इसे समझने के लिए समय व्यतीत करें।
वैकल्पिक समाधान: नहीं एक अन्य विकल्प की अनदेखी, यहाँ अन्य तरीकों से आप (ऊपर दृष्टिकोण के समान कैविएट्स के साथ) इस बिल्ली त्वचा सकता है में से एक, यह एक थोड़ा और गूढ़ है:
function partial(func/*, 0..n args */) {
var args = Array.prototype.slice.call(arguments, 1);
return function() {
var allArguments = args.concat(Array.prototype.slice.call(arguments));
return func.apply(this, allArguments);
};
}
Function.prototype.build = function(args) {
var constructor = this;
for(var i = 0; i < args.length; i++) {
constructor = partial(constructor, args[i]);
}
constructor.prototype = this.prototype;
var builtObject = new constructor();
builtObject.constructor = this;
return builtObject;
};
आनंद लें!
मैं OOP शब्दावली से परिचित नहीं हूँ ... आप, का एक नया उदाहरण बनाने के लिए संक्षेप में कोशिश कर रहे हैं, namespace.MyClass जब MyClass नहीं है नाम स्थान? – Anonymous
मैं नेमस्पेस का एक नया उदाहरण बनाने की कोशिश कर रहा हूं। MyClass, लेकिन नेमस्पेस के बारे में भूल जाओ जो हमेशा समान होता है। मैं केवल उदाहरण बनाते समय कन्स्ट्रक्टर को सरणी के रूप में तर्क पारित करने में सक्षम होने का लाभ उठाने का प्रयास कर रहा हूं। –
आह! इससे यह और स्पष्ट हो जाता है। मुझे अभी भी पता नहीं है कि आवेदन का उपयोग यहां किया जा सकता है - यह हो सकता है - लेकिन मैंने सूची समझ के बारे में कुछ रोचक बातें पढ़ी हैं और जैसे मोज़िला से रक्तस्राव-किनारे जेएस में। – Anonymous