2011-10-20 15 views
6

इंट्रोडक्टरी पढ़ने:हैंडलिंग एपीआई डिजाइन और OO चीनी

मैं ऊपर वर्णित पैटर्न के बाद निम्नलिखित

var Proto = { 
    constructor: function() { 
    this.works = true; 
    }, 
    method: function() { 
    return this.works; 
    } 
}; 

अब के रूप में बनाने के पुस्तकालयों/एपीआई लाइब्रेरी उपयोगकर्ताओं के लिए मेरे प्रोटोटाइप के साथ बातचीत करने के लिए (जो sup नहीं है कारखाने कार्यों चलती हैं) वे दृष्टांत और वस्तु

// instantiate 
var p = Object.create(Proto); 
// initialize 
p.constructor(); 

यह उपयोगकर्ताओं का दृष्टांत और मेरी वस्तुओं को प्रारंभ करने के लिए मजबूर के एक अमित्र और वर्बोज़ तरीका है आरंभ करने के लिए है।

व्यक्तिगत रूप से के बाद से मैं अपने सभी अनुप्रयोगों में pd का उपयोग मैं निम्नलिखित चीनी

// instantiate or initialize 
var p = Proto.new(); 
// or without bolting onto Object.prototype 
var p = pd.new(Proto); 

हालांकि मुझे लगता है कि उन पर पीडी मजबूर करने के लिए तो मुझे यकीन है कि क्या सबसे अच्छा तरीका है मेरे पुस्तकालयों उपयोगी बनाने के लिए है नहीं कर रहा हूँ निर्दयी है है ।

  1. लोग Proto के नए उदाहरण बना और .constructor themself
  2. फोर्स लोगों pd
  3. उपयोग करने के लिए फोन .create शैली कारखाने कार्यों दें
  4. ऊपर दो और का उपयोग new <Function> और .prototype

1 और 2 का पहले ही उल्लेख किया जा चुका है।

3 मूल रूप से

Proto.create = pd.new.bind(pd, Proto); 

4 मुझे दुख की बात है, लेकिन काम करने के एक ज्ञात मानक तरीका करने के लिए इस बात की पुष्टि कर जाएगा प्रयोज्य बढ़ जाती है।

आम तौर पर गैर-मानक ओओ पैटर्न का उपयोग करते समय लोगों को उनके आवेदन में मेरी लाइब्रेरी का उपयोग करने की अनुमति देने के लिए सबसे आसान तंत्र क्या हैं?

मैं वर्तमान में कहने के लिए

// here is my Prototype 
Proto; 
// here is how you instantiate a new instance 
var p = Object.create(Proto); 
// here is how you initialize it 
// yes instantiation and initialization are seperate and should be. 
p.constructor(); 
// Want sugar, use pd.new 

उत्तर

1

अभी के लिए, यदि आप एक छोटे एपीआई का उपयोग करते हैं, तो आप पारंपरिक कन्स्ट्रक्टर फ़ंक्शन बनाने में मदद करते हैं, जो सिंटैक्स का उपयोग करते हुए लगभग प्रोटोटाइप-ए-क्लास की तरह दिखता है। उदाहरण एपीआई उपयोग:

// Superclass 
var Person = Class.extend({ 
    constructor: function (name) { 
     this.name = name; 
    }, 
    describe: function() { 
     return "Person called "+this.name; 
    } 
}); 

// Subclass 
var Worker = Person.extend({ 
    constructor: function (name, title) { 
     Worker.super.constructor.call(this, name); 
     this.title = title; 
    }, 
    describe: function() { 
     return Worker.super.describe.call(this)+" ("+this.title+")"; 
    } 
}); 
var jane = new Worker("Jane", "CTO"); 

क्रियान्वयन:

+0

लेकिन फिर मूल रूप से बस # 4 है। मैं वस्तुओं को बना रहा हूं जो कार्य हैं। मैं वास्तव में ऐसा नहीं करना चाहता हूं। – Raynos

+0

@ रेनॉस: सच है, लेकिन यह सब कुछ करता है। मैं पसंद करूंगा कि हर कोई कक्षाओं (पीएसी) के रूप में प्रोटोटाइप का उपयोग करेगा, लेकिन शायद यह कभी नहीं होगा। हालांकि, [वर्ग शाब्दिक] (http://wiki.ecmascript.org/doku.php?id=harmony:classes) इसे ईएस 6 में बना देगा और फिर सब कुछ _looks_ पीएसी की तरह होगा। मुझे यह स्वीकार्य लगता है, क्योंकि यह चीजों को संगत रखता है। हुड _is_ के तहत क्या स्पष्ट रूप से संरचित है। मैं बस इसे प्रबंधित नहीं करना चाहता। अगर ES6 मेरे लिए ऐसा करता है - तो ठीक है। –

+0

मैंने चुना है ["यहां बताया गया है कि आप कैसे पीएसी को तत्काल और प्रारंभ करते हैं] (http://raynos.org/blog/7/Doing-Object-Oriented- जावास्क्रिप्ट--part-3)। अब जब आप जानते हैं, तो आप मेरे कोड का उपयोग कर सकते हैं, यह सब समझ में आता है। " – Raynos

0

मैं जाने के लिए प्रदान कर रहा है "उपयोग पीडी" विकल्प के अनुसार new(Prototype, [arguments]) समारोह रास्ता लगता है परीक्षा रहा हूँ। यह निर्भरता बिंदु से भी बुरा नहीं होना चाहिए (क्योंकि आप इस फ़ंक्शन को अलग से पैक कर सकते थे और उसके पास कोड की कुछ पंक्तियां हैं)

एक विशेष कार्य पेश करने से ऐतिहासिक परिप्रेक्ष्य में भी फिट बैठता है । यदि आप स्मॉलटाक पर वापस जाते हैं या यहां तक ​​कि पाइथन जैसे हालिया मामलों में भी आपके पास ऑब्जेक्ट सृजन (नया) और प्रारंभिकरण (init, कन्स्ट्रक्टर) के लिए अलग-अलग फ़ंक्शन हैं और केवल एकमात्र कारण है कि हम अलगाव को नहीं देखते हैं क्योंकि वे सिंटैक्टिक प्रदान करते हैं वस्तु तत्काल के लिए चीनी।

+0

चाहिए इस '। नया प्रोटोटाइप "क्लास" बनाने के लिए नया 'फ़ंक्शन जोड़ा जाएगा या इसे' ऑब्जेक्ट.प्रोटोटाइप.न्यू 'पर बोल्ड किया जाना चाहिए (और खराब प्रोग्रामर शापित हो!)। मूल रूप से मेरे सभी "वर्गों" के लिए 'नया' पर बोल्टिंग 'ऑब्जेक्ट.प्रोटोटाइप.न्यू' रखने का बिंदु खंडित करता है। – Raynos

+0

आप प्राचीन परंपरा का पालन कर सकते हैं और अपने ढांचे के कार्यों को एक मास्टर पेरेंट क्लास में डाल सकते हैं (अपने सभी वर्गों को इसके उत्तराधिकारी के लिए मजबूर कर सकते हैं) या आप सिर्फ एक सादे गैर-विधि फ़ंक्शन बना सकते हैं जैसे pd.new – hugomg

+0

प्रतीक्षा करें, "मास्टर पेरेंट क्लास "" विरासत मजबूर "। – Raynos

संबंधित मुद्दे