यहां मेरा समाधान है, जो कि लोरेंजो पोलिडोरी के उत्तर में वर्णित मानक प्रोटोटाइप विरासत विधि पर आधारित है ।
सबसे पहले, मैं इन सहायक तरीकों को परिभाषित करके शुरू करता हूं, जो बाद में चीजों को समझने में आसान और अधिक पठनीय हैं:
Function.prototype.setSuperclass = function(target) {
this._superclass = target;
this.prototype = Object.create(this._superclass.prototype);
this.prototype.constructor = this;
};
Function.prototype.getSuperclass = function(target) {
return this._superclass;
};
Function.prototype.callSuper = function(target, methodName, args) {
if (arguments.length < 3) {
return this.callSuperConstructor(arguments[0], arguments[1]);
}
if (args === undefined || args === null) args = [];
var superclass = this.getSuperclass();
if (superclass === undefined) throw new TypeError("A superclass for " + this + " could not be found.");
var method = superclass.prototype[methodName];
if (typeof method != "function") throw new TypeError("TypeError: Object " + superclass.prototype + " has no method '" + methodName + "'");
return method.apply(target, args);
};
Function.prototype.callSuperConstructor = function(target, args) {
if (args === undefined || args === null) args = [];
var superclass = this.getSuperclass();
if (superclass === undefined) throw new TypeError("A superclass for " + this + " could not be found.");
return superclass.apply(target, args);
};
अब, आप न केवल एक वर्ग के सुपरक्लास के साथ सेट कर सकते हैं SubClass.setSuperclass(ParentClass)
, बल्कि आप इसके साथ ओवरराइड तरीके भी कह सकते हैं SubClass.callSuper(this, 'functionName', [argument1, argument2...])
:
function Transform() {
this.type = "2d";
}
Transform.prototype.toString = function() {
return "Transform";
}
function Translation(x, y) {
Translation.callSuper(this, arguments);
this.x = x;
this.y = y;
}
Translation.setSuperclass(Transform);
Translation.prototype.toString = function() {
return Translation.callSuper(this, 'toString', arguments) + this.type + " Translation " + this.x + ":" + this.y;
}
function Rotation(angle) {
Rotation.callSuper(this, arguments);
this.angle = angle;
}
Rotation.setSuperclass(Transform);
Rotation.prototype.toString = function() {
return Rotation.callSuper(this, 'toString', arguments) + this.type + " Rotation " + this.angle;
}
translation = new Translation(10, 15);
console.log(translation instanceof Transform);
console.log(translation instanceof Translation);
console.log(translation instanceof Rotation);
console.log(translation.toString())
जाहिर है, सहायक कार्यों के साथ भी यहाँ वाक्य रचना बहुत अजीब है। शुक्र है कि हालांकि, ECMAScript 6 में चीजों को ज्यादा प्रिटियर करने के लिए कुछ सिंथैटिक शुगर ( अधिकतम न्यूनतम कक्षाएं ) जोड़ी गई हैं। उदाहरण के लिए:
class Transform {
constructor() {
this.type = "2d";
}
toString() {
return "Transform";
}
}
class Translation extends Transform {
constructor(x, y) {
super();
this.x = x;
this.y = y;
}
toString() {
return super(...arguments) + this.type + " Translation " + this.x + ":" + this.y;
}
}
class Rotation extends Transform {
constructor(angle) {
super(...arguments);
this.angle = angle;
}
toString() {
return super(...arguments) + this.type + " Rotation " + this.angle;
}
}
translation = new Translation(10, 15);
console.log(translation instanceof Transform);
console.log(translation instanceof Translation);
console.log(translation instanceof Rotation);
console.log(translation.toString())
ध्यान दें कि ECMAScript 6 इस बिंदु पर अभी भी मसौदा चरण में है, और जहाँ तक मुझे पता है कि किसी भी प्रमुख वेब ब्राउज़र में लागू नहीं किया गया है। हालाँकि, यदि आप चाहें तो सादे पुराने- आधारित जावास्क्रिप्ट को संकलित करने के लिए ट्रेसर कंपाइलर जैसी किसी चीज़ का उपयोग कर सकते हैं । आप यहां ट्रेसेर का उपयोग करके संकलित उपरोक्त उदाहरण देख सकते हैं ।ECMAScript 6
ECMAScript 5