मैं जावास्क्रिप्ट में एक सार आधार वर्ग कैसे बनाऊं?


109

क्या जावास्क्रिप्ट में सार आधार वर्ग का अनुकरण संभव है? इसे करने का सबसे सुरुचिपूर्ण तरीका क्या है?

कहो, मैं कुछ करना चाहता हूं: -

var cat = new Animal('cat');
var dog = new Animal('dog');

cat.say();
dog.say();

यह आउटपुट चाहिए: 'बार्क', 'म्याऊ'


जवाबों:


127

सार वर्ग बनाने का एक सरल तरीका यह है:

/**
 @constructor
 @abstract
 */
var Animal = function() {
    if (this.constructor === Animal) {
      throw new Error("Can't instantiate abstract class!");
    }
    // Animal initialization...
};

/**
 @abstract
 */
Animal.prototype.say = function() {
    throw new Error("Abstract method!");
}

Animal"वर्ग" और sayविधि सार हैं।

एक उदाहरण बनाने से एक त्रुटि होगी:

new Animal(); // throws

यह है कि आप इससे कैसे "विरासत" लेते हैं:

var Cat = function() {
    Animal.apply(this, arguments);
    // Cat initialization...
};
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

Cat.prototype.say = function() {
    console.log('meow');
}

Dog जैसा दिखता है।

और इसी तरह आपका परिदृश्य चलता है:

var cat = new Cat();
var dog = new Dog();

cat.say();
dog.say();

यहां फिडल (कंसोल आउटपुट को देखें)।


क्या आप लाइन से लाइन समझा सकते हैं, अगर आपको कोई आपत्ति नहीं है, क्योंकि मैं OOPs में नया हूँ। धन्यवाद!
रिएक्टर डेवलपर

2
@undefined: इसे समझने के लिए मैं सुझाव देता हूं कि आप जावास्क्रिप्ट में प्रोटोटाइपिक विरासत को देखें: यह एक अच्छा मार्गदर्शक है।
जोर्डो

उत्तर के लिए धन्यवाद .. लिंक के माध्यम से जाना जाएगा।
रिएक्टर डेवलपर

इसका सबसे महत्वपूर्ण टुकड़ा यह है कि बहुत पहले कोड स्निपेट में, एक त्रुटि डाली जा रही है। आप एक चेतावनी भी फेंक सकते हैं या एक वस्तु के बजाय एक अशक्त मान लौटा सकते हैं ताकि आवेदन निष्पादन जारी रखा जा सके, यह वास्तव में आपके कार्यान्वयन पर निर्भर करता है। यह, मेरी राय में, सार जेएस "कक्षाएं" को लागू करने का सही तरीका है।
ड्यूडेवड १16

1
@ G1P: यह जावास्क्रिप्ट में "सुपर-क्लास कंस्ट्रक्टर" को निष्पादित करने का सामान्य तरीका है, और इसे मैन्युअल रूप से करने की आवश्यकता है।
जोर्डो

46

जावास्क्रिप्ट कक्षाएं और वंशानुक्रम (ES6)

ईएस 6 के अनुसार, आप जो कुछ भी आवश्यक है उसे पूरा करने के लिए जावास्क्रिप्ट कक्षाओं और विरासत का उपयोग कर सकते हैं।

ECMAScript 2015 में शुरू की गई जावास्क्रिप्ट कक्षाएं, मुख्य रूप से जावास्क्रिप्ट के मौजूदा प्रोटोटाइप-आधारित वंशानुक्रम पर सिंथेटिक चीनी हैं।

संदर्भ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Clretes

सबसे पहले, हम अपने अमूर्त वर्ग को परिभाषित करते हैं। इस वर्ग को त्वरित नहीं किया जा सकता है, लेकिन इसे बढ़ाया जा सकता है। हम उन कार्यों को भी परिभाषित कर सकते हैं जिन्हें सभी वर्गों में लागू किया जाना चाहिए जो इसे बढ़ाता है।

/**
 * Abstract Class Animal.
 *
 * @class Animal
 */
class Animal {

  constructor() {
    if (this.constructor == Animal) {
      throw new Error("Abstract classes can't be instantiated.");
    }
  }

  say() {
    throw new Error("Method 'say()' must be implemented.");
  }

  eat() {
    console.log("eating");
  }
}

उसके बाद, हम अपनी ठोस कक्षाएं बना सकते हैं। ये कक्षाएं अमूर्त वर्ग से सभी कार्यों और व्यवहार को विरासत में मिलेंगी।

/**
 * Dog.
 *
 * @class Dog
 * @extends {Animal}
 */
class Dog extends Animal {
  say() {
    console.log("bark");
  }
}

/**
 * Cat.
 *
 * @class Cat
 * @extends {Animal}
 */
class Cat extends Animal {
  say() {
    console.log("meow");
  }
}

/**
 * Horse.
 *
 * @class Horse
 * @extends {Animal}
 */
class Horse extends Animal {}

और परिणाम ...

// RESULTS

new Dog().eat(); // eating
new Cat().eat(); // eating
new Horse().eat(); // eating

new Dog().say(); // bark
new Cat().say(); // meow
new Horse().say(); // Error: Method say() must be implemented.

new Animal(); // Error: Abstract classes can't be instantiated.

27

क्या आपका मतलब कुछ इस तरह का था:

function Animal() {
  //Initialization for all Animals
}

//Function and properties shared by all instances of Animal
Animal.prototype.init=function(name){
  this.name=name;
}
Animal.prototype.say=function(){
    alert(this.name + " who is a " + this.type + " says " + this.whattosay);
}
Animal.prototype.type="unknown";

function Cat(name) {
    this.init(name);

    //Make a cat somewhat unique
    var s="";
    for (var i=Math.ceil(Math.random()*7); i>=0; --i) s+="e";
    this.whattosay="Me" + s +"ow";
}
//Function and properties shared by all instances of Cat    
Cat.prototype=new Animal();
Cat.prototype.type="cat";
Cat.prototype.whattosay="meow";


function Dog() {
    //Call init with same arguments as Dog was called with
    this.init.apply(this,arguments);
}

Dog.prototype=new Animal();
Dog.prototype.type="Dog";
Dog.prototype.whattosay="bark";
//Override say.
Dog.prototype.say = function() {
        this.openMouth();
        //Call the original with the exact same arguments
        Animal.prototype.say.apply(this,arguments);
        //or with other arguments
        //Animal.prototype.say.call(this,"some","other","arguments");
        this.closeMouth();
}

Dog.prototype.openMouth=function() {
   //Code
}
Dog.prototype.closeMouth=function() {
   //Code
}

var dog = new Dog("Fido");
var cat1 = new Cat("Dash");
var cat2 = new Cat("Dot");


dog.say(); // Fido the Dog says bark
cat1.say(); //Dash the Cat says M[e]+ow
cat2.say(); //Dot the Cat says M[e]+ow


alert(cat instanceof Cat) // True
alert(cat instanceof Dog) // False
alert(cat instanceof Animal) // True

शायद मैं चूक गया। बेस क्लास (पशु) सार कहां है?
HairOfTheDog

5
@HairOfTheDog हाँ, आपने याद किया कि यह लगभग पांच साल पहले उत्तर दिया गया था, उस समय की जावास्क्रिप्ट में अमूर्त वर्ग नहीं थे, यह प्रश्न इसे अनुकरण करने के तरीके के लिए था (यह जानवरwhattosay में परिभाषित नहीं है ), और यह उत्तर स्पष्ट रूप से पूछता है यदि प्रस्तावित उत्तर प्रश्नकर्ता की तलाश में था। यह जावास्क्रिप्ट में अमूर्त वर्गों के लिए एक समाधान देने का दावा नहीं करता है। प्रश्नकर्ता ने मुझे या किसी और को जवाब देने की जहमत नहीं उठाई, इसलिए मुझे इस बारे में कोई जानकारी नहीं है अगर यह उसके लिए काम करता है। मुझे खेद है कि अगर किसी के सवाल का पांच साल पुराना प्रस्तावित उत्तर आपके लिए कारगर नहीं हुआ।
कुछ

15

आप डीन एडवर्ड्स के बेस क्लास: http://dean.edwards.name/weblog/2006/03/baya/ को देखना चाहेंगे।

वैकल्पिक रूप से, डगलस क्रोकफोर्ड द्वारा जावास्क्रिप्ट में शास्त्रीय विरासत पर यह उदाहरण / लेख है: http://www.crockford.com/javascript/inheritance.html


13
क्रॉकफोर्ड लिंक के बारे में, यह बकवास का एक भार है। उन्होंने उस लेख के अंत में एक नोट जोड़ा है: "अब मैं जावास्क्रिप्ट में शास्त्रीय मॉडल को एक गलती के रूप में समर्थन करने के अपने शुरुआती प्रयासों को देखता हूं।"
मैट बॉल

11

क्या जावास्क्रिप्ट में सार आधार वर्ग का अनुकरण संभव है?

निश्चित रूप से। जावास्क्रिप्ट में क्लास / इंस्टेंस सिस्टम को लागू करने के लगभग एक हजार तरीके हैं। यहाँ एक है:

// Classes magic. Define a new class with var C= Object.subclass(isabstract),
// add class members to C.prototype,
// provide optional C.prototype._init() method to initialise from constructor args,
// call base class methods using Base.prototype.call(this, ...).
//
Function.prototype.subclass= function(isabstract) {
    if (isabstract) {
        var c= new Function(
            'if (arguments[0]!==Function.prototype.subclass.FLAG) throw(\'Abstract class may not be constructed\'); '
        );
    } else {
        var c= new Function(
            'if (!(this instanceof arguments.callee)) throw(\'Constructor called without "new"\'); '+
            'if (arguments[0]!==Function.prototype.subclass.FLAG && this._init) this._init.apply(this, arguments); '
        );
    }
    if (this!==Object)
        c.prototype= new this(Function.prototype.subclass.FLAG);
    return c;
}
Function.prototype.subclass.FLAG= new Object();

var बिल्ली = नया जानवर ('बिल्ली');

यह वास्तव में निश्चित रूप से एक सार आधार वर्ग नहीं है। क्या आपका मतलब कुछ ऐसा है:

var Animal= Object.subclass(true); // is abstract
Animal.prototype.say= function() {
    window.alert(this._noise);
};

// concrete classes
var Cat= Animal.subclass();
Cat.prototype._noise= 'meow';
var Dog= Animal.subclass();
Dog.prototype._noise= 'bark';

// usage
var mycat= new Cat();
mycat.say(); // meow!
var mygiraffe= new Animal(); // error!

बुराई नए फ़ंक्शन (...) का उपयोग क्यों करते हैं? Var c = function () {...} नहीं होगा; बेहतर बनो?
फियोनबियो

2
"Var c = function () {...}" सबक्लास () या अन्य युक्त स्कोप में किसी भी चीज़ पर क्लोज़र बनाएगा। संभवतः महत्वपूर्ण नहीं है, लेकिन मैं इसे संभावित-अवांछित माता-पिता के दायरे से साफ रखना चाहता था; शुद्ध-पाठ समारोह () निर्माण बंद होने से बचा जाता है।
बोबिन्स

10
Animal = function () { throw "abstract class!" }
Animal.prototype.name = "This animal";
Animal.prototype.sound = "...";
Animal.prototype.say = function() {
    console.log( this.name + " says: " + this.sound );
}

Cat = function () {
    this.name = "Cat";
    this.sound = "meow";
}

Dog = function() {
    this.name = "Dog";
    this.sound  = "woof";
}

Cat.prototype = Object.create(Animal.prototype);
Dog.prototype = Object.create(Animal.prototype);

new Cat().say();    //Cat says: meow
new Dog().say();    //Dog says: woof 
new Animal().say(); //Uncaught abstract class! 

क्या उप-वर्ग का निर्माता सुपरक्लास के निर्माता का आह्वान कर सकता है? (जैसे किसी भाषा में सुपर को बुलाना ... यदि ऐसा है, तो यह बिना शर्त के अपवाद को बढ़ा देगा
गैरबराबरी

5
function Animal(type) {
    if (type == "cat") {
        this.__proto__ = Cat.prototype;
    } else if (type == "dog") {
        this.__proto__ = Dog.prototype;
    } else if (type == "fish") {
        this.__proto__ = Fish.prototype;
    }
}
Animal.prototype.say = function() {
    alert("This animal can't speak!");
}

function Cat() {
    // init cat
}
Cat.prototype = new Animal();
Cat.prototype.say = function() {
    alert("Meow!");
}

function Dog() {
    // init dog
}
Dog.prototype = new Animal();
Dog.prototype.say = function() {
    alert("Bark!");
}

function Fish() {
    // init fish
}
Fish.prototype = new Animal();

var newAnimal = new Animal("dog");
newAnimal.say();

यह __proto__मानक चर के रूप में काम करने की गारंटी नहीं है, लेकिन यह कम से कम फ़ायरफ़ॉक्स और सफारी में काम करता है।

यदि आपको समझ में नहीं आता है कि यह कैसे काम करता है, तो प्रोटोटाइप श्रृंखला के बारे में पढ़ें।


एफएफए और चोम में एएफओआईए केवल एएफएआईके काम करता है (न तो आईई और न ही ओपेरा इसका समर्थन करता है। मैंने सफारी में परीक्षण नहीं किया है)। BTW, आप इसे गलत कर रहे हैं: बेस क्लास (पशु) को हर बार एक नए प्रकार का जानवर चाहिए था जिसे संपादित किया जाना चाहिए।
कुछ

सफारी और क्रोम दोनों एक ही जावास्क्रिप्ट इंजन का उपयोग करते हैं। मुझे वास्तव में यकीन नहीं था कि वह केवल यह जानना चाहता था कि वंशानुक्रम कैसे काम करता है, इसलिए मैंने यथासंभव उसके उदाहरण का अनुसरण करने की कोशिश की।
जॉर्ज स्कोली

4
सफारी और क्रोम एक ही जावास्क्रिप्ट इंजन का उपयोग नहीं करते हैं, सफारी जावास्क्रिप्ट का उपयोग करता है और क्रोम V8 का उपयोग करता है । दोनों ब्राउज़र साझा करने वाली चीज़ लेआउट इंजन, WebKit है
सीएमएस

@ GeorgSchölly कृपया नए Object.getPrototypOf निर्माण का उपयोग करने के लिए अपने उत्तर को संपादित करने पर विचार करें
बेंजामिन

@ बैंजामिन: मोज़िला के अनुसारsetPrototypeOf अभी तक कोई ऐसा तरीका नहीं है जिसके लिए मुझे अपने कोड की आवश्यकता होगी।
जॉर्ज शॉली

5

आप ऑब्जेक्ट प्रोटोटाइप का उपयोग करके अमूर्त कक्षाएं बना सकते हैं, एक सरल उदाहरण इस प्रकार हो सकता है:

var SampleInterface = {
   addItem : function(item){}  
}

आप विधि के ऊपर बदल सकते हैं या नहीं, यह आपके ऊपर है कि आप इसे कब लागू करते हैं। विस्तृत अवलोकन के लिए, आप यहां जाना चाह सकते हैं ।


5

प्रश्न काफी पुराना है, लेकिन मैंने कुछ संभावित समाधान तैयार किए कि कैसे अमूर्त "वर्ग" बनाया जाए और उस प्रकार की वस्तु का निर्माण अवरुद्ध किया जाए।

//our Abstract class
var Animal=function(){
  
    this.name="Animal";
    this.fullname=this.name;
    
    //check if we have abstract paramater in prototype
    if (Object.getPrototypeOf(this).hasOwnProperty("abstract")){
    
    throw new Error("Can't instantiate abstract class!");
    
    
    }
    

};

//very important - Animal prototype has property abstract
Animal.prototype.abstract=true;

Animal.prototype.hello=function(){

   console.log("Hello from "+this.name);
};

Animal.prototype.fullHello=function(){

   console.log("Hello from "+this.fullname);
};

//first inheritans
var Cat=function(){

	  Animal.call(this);//run constructor of animal
    
    this.name="Cat";
    
    this.fullname=this.fullname+" - "+this.name;

};

Cat.prototype=Object.create(Animal.prototype);

//second inheritans
var Tiger=function(){

    Cat.call(this);//run constructor of animal
    
    this.name="Tiger";
    
    this.fullname=this.fullname+" - "+this.name;
    
};

Tiger.prototype=Object.create(Cat.prototype);

//cat can be used
console.log("WE CREATE CAT:");
var cat=new Cat();
cat.hello();
cat.fullHello();

//tiger can be used

console.log("WE CREATE TIGER:");
var tiger=new Tiger();
tiger.hello();
tiger.fullHello();


console.log("WE CREATE ANIMAL ( IT IS ABSTRACT ):");
//animal is abstract, cannot be used - see error in console
var animal=new Animal();
animal=animal.fullHello();

जैसा कि आप देख सकते हैं कि अंतिम वस्तु हमें त्रुटि देती है, ऐसा इसलिए है क्योंकि प्रोटोटाइप में पशु के पास संपत्ति है abstract। यह सुनिश्चित करने के लिए कि यह कोई पशु नहीं है जिसकी Animal.prototypeप्रोटोटाइप श्रृंखला मेरे पास है:

Object.getPrototypeOf(this).hasOwnProperty("abstract")

इसलिए मैं जांचता हूं कि मेरे निकटतम प्रोटोटाइप ऑब्जेक्ट में abstractप्रॉपर्टी है, केवल Animalप्रोटोटाइप से सीधे बनाई गई ऑब्जेक्ट में यह स्थिति सही पर होगी। फ़ंक्शन hasOwnPropertyकेवल वर्तमान ऑब्जेक्ट के गुणों की जांच करता है न कि उनके प्रोटोटाइप, इसलिए यह हमें 100% सुनिश्चित करता है कि संपत्ति यहां घोषित की गई है प्रोटोटाइप श्रृंखला में नहीं।

ऑब्जेक्ट से उतारा गया प्रत्येक ऑब्जेक्ट hasOwnProperty मेथड विरासत में मिला है। इस विधि का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि किसी वस्तु में उस वस्तु की प्रत्यक्ष संपत्ति के रूप में निर्दिष्ट संपत्ति है या नहीं; ऑपरेटर के विपरीत, यह विधि ऑब्जेक्ट की प्रोटोटाइप श्रृंखला की जांच नहीं करती है। इसके बारे में अधिक जानकारी:

मेरे प्रस्ताव में हमें constructorहर बार बदलने की ज़रूरत नहीं है Object.create, क्योंकि यह @ जोर्डो द्वारा वर्तमान सर्वोत्तम उत्तर में है।

समाधान भी पदानुक्रम में कई अमूर्त कक्षाएं बनाने में सक्षम बनाता है, हमें केवल abstractप्रोटोटाइप में संपत्ति बनाने की आवश्यकता है ।


4

एक और बात जिसे आप लागू करना चाहते हैं वह यह सुनिश्चित कर रही है कि आपका अमूर्त वर्ग त्वरित नहीं है। आप ऐसा कर सकते हैं कि एक फ़ंक्शन को परिभाषित करके, जो FLAG के रूप में कार्य करता है, सार वर्ग निर्माता के रूप में सेट किया गया है। इसके बाद FLAG का निर्माण करने की कोशिश की जाएगी, जो इसके निर्माणकर्ता को अपवाद कहेगी। नीचे उदाहरण:

(function(){

    var FLAG_ABSTRACT = function(__class){

        throw "Error: Trying to instantiate an abstract class:"+__class
    }

    var Class = function (){

        Class.prototype.constructor = new FLAG_ABSTRACT("Class");       
    }

    //will throw exception
    var  foo = new Class();

})()


2

हम Factoryइस मामले में डिजाइन पैटर्न का उपयोग कर सकते हैं । prototypeमाता-पिता के सदस्यों को विरासत में देने के लिए जावास्क्रिप्ट का उपयोग करें।

पैरेंट क्लास कंस्ट्रक्टर को परिभाषित करें।

var Animal = function() {
  this.type = 'animal';
  return this;
}
Animal.prototype.tired = function() {
  console.log('sleeping: zzzZZZ ~');
}

और फिर बच्चों की क्लास बनाएं।

// These are the child classes
Animal.cat = function() {
  this.type = 'cat';
  this.says = function() {
    console.log('says: meow');
  }
}

फिर चिल्ड्रन क्लास कंस्ट्रक्टर को परिभाषित करें।

// Define the child class constructor -- Factory Design Pattern.
Animal.born = function(type) {
  // Inherit all members and methods from parent class,
  // and also keep its own members.
  Animal[type].prototype = new Animal();
  // Square bracket notation can deal with variable object.
  creature = new Animal[type]();
  return creature;
}

झसे आज़माओ।

var timmy = Animal.born('cat');
console.log(timmy.type) // cat
timmy.says(); // meow
timmy.tired(); // zzzZZZ~

यहाँ पूर्ण उदाहरण कोडिंग के लिए कोडपेन लिंक दिया गया है।


1
//Your Abstract class Animal
function Animal(type) {
    this.say = type.say;
}

function catClass() {
    this.say = function () {
        console.log("I am a cat!")
    }
}
function dogClass() {
    this.say = function () {
        console.log("I am a dog!")
    }
}
var cat = new Animal(new catClass());
var dog = new Animal(new dogClass());

cat.say(); //I am a cat!
dog.say(); //I am a dog!

यह जावास्क्रिप्ट में बहुरूपता है, आप ओवरराइड को लागू करने के लिए कुछ जांच कर सकते हैं।
बजे पॉल ओरेजुलिक

0

मुझे लगता है कि वे सभी उत्तर विशेष रूप से पहले दो ( कुछ और जोर्डो द्वारा ) पारंपरिक प्रोटोटाइप बेस जेएस अवधारणा के साथ स्पष्ट रूप से प्रश्न का उत्तर देते हैं।
अब जैसा कि आप चाहते हैं कि पशु वर्ग कंस्ट्रक्टर निर्माण के लिए दिए गए पैरामीटर के अनुसार व्यवहार करे, मुझे लगता है कि यह Creational Patternsउदाहरण के तौर पर फैक्ट्री पैटर्न के बुनियादी व्यवहार से बहुत मिलता-जुलता है ।

यहाँ मैंने इसे इस तरह से काम करने के लिए थोड़ा दृष्टिकोण दिया।

var Animal = function(type) {
    this.type=type;
    if(type=='dog')
    {
        return new Dog();
    }
    else if(type=="cat")
    {
        return new Cat();
    }
};



Animal.prototype.whoAreYou=function()
{
    console.log("I am a "+this.type);
}

Animal.prototype.say = function(){
    console.log("Not implemented");
};




var Cat =function () {
    Animal.call(this);
    this.type="cat";
};

Cat.prototype=Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

Cat.prototype.say=function()
{
    console.log("meow");
}



var Dog =function () {
    Animal.call(this);
    this.type="dog";
};

Dog.prototype=Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.say=function()
{
    console.log("bark");
}


var animal=new Animal();


var dog = new Animal('dog');
var cat=new Animal('cat');

animal.whoAreYou(); //I am a undefined
animal.say(); //Not implemented


dog.whoAreYou(); //I am a dog
dog.say(); //bark

cat.whoAreYou(); //I am a cat
cat.say(); //meow

इसे जोड़ने के लिए: programmers.stackexchange.com/questions/219543/… इस Animalनिर्माता को एक विरोधी पैटर्न के रूप में देखा जा सकता है, एक सुपरक्लास को उपवर्गों के बारे में ज्ञान नहीं होना चाहिए। (
लिज़कोव

0
/****************************************/
/* version 1                            */
/****************************************/

var Animal = function(params) {
    this.say = function()
    {
        console.log(params);
    }
};
var Cat = function() {
    Animal.call(this, "moes");
};

var Dog = function() {
    Animal.call(this, "vewa");
};


var cat = new Cat();
var dog = new Dog();

cat.say();
dog.say();


/****************************************/
/* version 2                            */
/****************************************/

var Cat = function(params) {
    this.say = function()
    {
        console.log(params);
    }
};

var Dog = function(params) {
    this.say = function()
    {
        console.log(params);
    }
};

var Animal = function(type) {
    var obj;

    var factory = function()
    {
        switch(type)
        {
            case "cat":
                obj = new Cat("bark");
                break;
            case "dog":
                obj = new Dog("meow");
                break;
        }
    }

    var init = function()
    {
        factory();
        return obj;
    }

    return init();
};


var cat = new Animal('cat');
var dog = new Animal('dog');

cat.say();
dog.say();

मेरे दृष्टिकोण में, कम कोड के साथ अच्छे परिणाम के लिए यह सबसे सुंदर तरीका है।
तामस रोमियो

1
कृपया बताएं कि यह क्यों उपयोगी है। कोड सौंपना लगभग उतना उपयोगी नहीं है जितना यह बताना कि कोड उपयोगी क्यों है। यह किसी को मछली सौंपने, या उन्हें मछली कैसे सिखाने के बीच का अंतर है।
टीन मैन

कई अपने जावास्क्रिप्ट प्रोग्रामिंग तकनीकों प्रोटोटाइप या कंस्ट्रक्टर में उपयोग नहीं करते हैं। भले ही वे कई स्थितियों में उपयोगी हों। उन लोगों के लिए, मुझे लगता है कि कोड उपयोगी है। इसलिए नहीं कि कोड दूसरों की तुलना में बेहतर है .. बल्कि इसलिए कि यह समझना आसान है
तमस रोमियो

0

यदि आप यह सुनिश्चित करना चाहते हैं कि आपके आधार वर्ग और उनके सदस्य कड़ाई से सार हैं तो एक आधार वर्ग है जो आपके लिए ऐसा करता है:

class AbstractBase{
    constructor(){}
    checkConstructor(c){
        if(this.constructor!=c) return;
        throw new Error(`Abstract class ${this.constructor.name} cannot be instantiated`);
    }
    throwAbstract(){
        throw new Error(`${this.constructor.name} must implement abstract member`);}    
}

class FooBase extends AbstractBase{
    constructor(){
        super();
        this.checkConstructor(FooBase)}
    doStuff(){this.throwAbstract();}
    doOtherStuff(){this.throwAbstract();}
}

class FooBar extends FooBase{
    constructor(){
        super();}
    doOtherStuff(){/*some code here*/;}
}

var fooBase = new FooBase(); //<- Error: Abstract class FooBase cannot be instantiated
var fooBar = new FooBar(); //<- OK
fooBar.doStuff(); //<- Error: FooBar must implement abstract member
fooBar.doOtherStuff(); //<- OK

सख्त मोड थ्रोअब्रेट विधि में कॉलर को लॉग करना असंभव बनाता है, लेकिन त्रुटि डिबग वातावरण में होनी चाहिए जो स्टैक ट्रेस दिखाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.