मैं पाइथन और स्मॉलटॉक में पृष्ठभूमि से जावास्क्रिप्ट में आ रहा हूं, और मैं भाषा में स्वयं और लिस्प के लिनेज की सराहना करता हूं। ईसीएमएस्क्रिप्ट 5 के साथ, मैं नए ऑपरेटर के बिना प्रोटोटाइप ओओ में अपना हाथ देखना चाहता था।ऑब्जेक्ट.क्रेट और नामित रचनाकारों के साथ प्रोटोटाइप ओओ
प्रतिबंध:
- वैकल्पिक नए ऑपरेटर कक्षाएं बनाने के लिए
- प्रोटोटाइप श्रृंखला समर्थन डिबगिंग
- alloc() init() निर्माण की तरह अनुक्रम WebInspector के लिए instanceof
- नामित निर्माताओं के लिए सही होनी चाहिए। उद्देश्य-सी और पायथन
टी को पूरा करने के कार्यान्वयन पर मेरा प्रयास यहां है वह मापदंड:
function subclass(Class, Base) {
"use strict";
function create(self, args) {
if (!(self instanceof this))
self = Object.create(this.prototype);
var init = self.__init__;
return init ? init.apply(self, args) : self;
}
if (Base instanceof Function) Base = Base.prototype;
else if (Base===undefined) Base = Object.prototype;
Class.prototype = Object.create(Base);
Class.prototype.constructor = Class;
Class.create = create;
Class.define = function define(name, fn) { return Class.prototype[name] = fn; };
Class.define('__name__', Class.name);
return Class;
}
और यह एक सरल mockup में काम करने के लिए लगता है:
function Family(){return Family.create(this, arguments)}
subclass(Family, Object);
Family.define('__init__', function __init__(n){this.name=n; return this;});
function Tribe(){return Tribe.create(this, arguments)}
subclass(Tribe, Family);
function Genus(){return Genus.create(this, arguments)}
subclass(Genus, Tribe);
function Species(){return Species.create(this, arguments)}
subclass(Species, Genus);
एक कारखाने समारोह के रूप में वर्ग का उपयोग करना:
var dog = Species('dog');
console.assert(dog instanceof Object);
console.assert(dog instanceof Family);
console.assert(dog instanceof Tribe);
console.assert(dog instanceof Genus);
console.assert(dog instanceof Species);
या नए ऑपरेटर का उपयोग:
var cat = new Species('cat');
console.assert(cat instanceof Object);
console.assert(cat instanceof Family);
console.assert(cat instanceof Tribe);
console.assert(cat instanceof Genus);
console.assert(cat instanceof Species);
console.assert(Object.getPrototypeOf(dog) === Object.getPrototypeOf(cat))
क्या मैंने जरूरी अनदेखा किया है मेरे कार्यान्वयन में प्रोटोटाइप ओओ की विशेषताएं? क्या जावास्क्रिप्ट सम्मेलन या इंटरैक्शन हैं जिसके लिए मुझे बदलाव करना चाहिए? संक्षेप में, यहां "गॉचा" क्या हैं, और क्या कोई स्पष्ट सुधार किया जा सकता है?
मैं निर्माता की परिभाषाओं के साथ DRYER बनना चाहता था, लेकिन मैंने पाया कि एक फ़ंक्शन का नाम संपत्ति लिखने योग्य नहीं है, और यही वेबकिट इंस्पेक्टर के ऑब्जेक्ट नामों का समर्थन करता है। मैं जो चाहता था उसे पूरा करने के लिए एक eval निर्माण करने में सक्षम था, लेकिन ... यक।
वाह, मैं कभी नहीं जावास्क्रिप्ट इस तरह का उपयोग कर देखा है ... अगर जब तुम पर कार्रवाई "अविश्वसनीय" datas –
eval खतरनाक है, लेकिन मुझे नहीं क्यों एक eval उपयोग नहीं करना चाहिए, वास्तव में जब आप ऐसा करते हैं [ अस्थिर] आप किसी प्रकार के eval का उपयोग कर रहे हैं, क्योंकि जेएस में कोई सहयोगी सरणी नहीं हैं। – mpm
@camus yes, और मैंने यह सुनिश्चित करने के लिए एक '/ \ w +/'regexp भी उपयोग किया है कि यह केवल एक वैध विधि नाम था। लेकिन ऐसा लगता है कि एक स्टेक स्थापित करने के लिए स्लेजहैमर का उपयोग करना - यह फ़ंक्शन की नाम संपत्ति सेट करने की अनुमति देने पर बहुत अधिक सुरुचिपूर्ण होगा। जावास्क्रिप्ट एक प्रोटोटाइप भाषा है, सभी के बाद ... –