क्या जावास्क्रिप्ट क्लास में किसी फ़ंक्शन को ओवरराइड करना संभव है, और इसे इसके मूल कार्यान्वयन को कॉल करना संभव है? मैंने इसे प्रोटोटाइप का उपयोग करके हासिल किया है, लेकिन मैं कुछ डेटा के लिए गोपनीयता बनाए रखने की कोशिश कर रहा हूं।

मेरे पास अब तक यही है, और यह काम नहीं करता है। मैं देख सकता हूं कि यह क्यों काम नहीं करता है, लेकिन मुझे इसे हल करने का कोई तरीका नहीं दिख रहा है। मुझे आश्चर्य हो रहा है कि जावास्क्रिप्ट में यह संभव नहीं है (बहुत सारे हुप्स के माध्यम से कूदने के बिना)।

इसके अलावा, मुझे IE11 का समर्थन करने की आवश्यकता है, इसलिए ES6 का उपयोग नहीं कर सकता।

    var NoProto = NoProto || {};

    NoProto.Shape = (function(){
        var thing = function(name){
            var privateData = 'this is a ' + name;

            var self = this;
            this.base = function(){
                return self;
            };

            this.doStuff = function(){
                return privateData;
            };
        };

        return thing;
    })();

    NoProto.Square = (function(){
        var thing = function(colour){
            NoProto.Shape.call(this, "square");

            this.doStuff = function(){
                // this fails (stack overflow)
                // ------> how to call the "base" function: doStuff, and preserve the private data?
                var val = this.base().doStuff();
                return val + ', which is '+ colour;
            };
        };

        thing.prototype = Object.create(NoProto.Shape.prototype);

        return thing;
    })();

उपयोग:

        var noProtoSqr = new NoProto.Square('blue');
        try {
            alert(noProtoSqr.doStuff()); // ---> Stack Overflow!
        } catch (e){
            console.error('There was an error: ' + e);
        }

संदर्भ के लिए, मैं इसे प्रोटोटाइप के साथ कैसे काम कर रहा हूं:

    var Proto = Proto || {};

    Proto.Shape = (function(){
        var thing = function(name){
            this._pseudoPrivateData = 'this is a ' + name;
        };

        thing.prototype._pseudoPrivateData = '';
        thing.prototype.doStuff = function(){
            return this._pseudoPrivateData;
        };

        return thing;
    })();

    Proto.Square = (function(){
        var thing = function(colour){
            Proto.Shape.call(this, "square");
            this._colour = colour;
        };

        thing.prototype = Object.create(Proto.Shape.prototype);

        thing.prototype._colour = '';
        thing.prototype.doStuff = function(){
            var val = Proto.Shape.prototype.doStuff.call(this);
            return val + ', which is '+ this._colour;
        };

        return thing;
    })();

उपयोग:

        var protoSqr = new Proto.Square('blue');
        try {
            alert(protoSqr.doStuff());  // --> "this is a square, which is blue"
        } catch (e){
            console.error('There was an error: ' + e);
        }
5
RikRak 21 सितंबर 2018, 13:34

1 उत्तर

सबसे बढ़िया उत्तर

जब आप उपयोग करते हैं

NoProto.Shape.call(this, "square")

यदि आप यही चाहते हैं, तो यह Shape के doStuff को वर्तमान तात्कालिकता को निर्दिष्ट करता है। तो, अब this.doStuff NoProto.shape से मूल doStuff फ़ंक्शन को संदर्भित करेगा। यदि आप मूल doStuff को कॉल करने में सक्षम होने के दौरान वर्तमान तात्कालिकता पर doStuff फ़ंक्शन को अधिलेखित करना चाहते हैं, तो this.doStuff को असाइन करने से पहले पुराने doStuff का संदर्भ सहेजें:

var thing = function(colour){
  NoProto.Shape.call(this, "square");
  const oldDoStuff = this.doStuff;
  this.doStuff = function(){
    var val = oldDoStuff();
    return val + ', which is '+ colour;
  };
};

लाइव स्निपेट:

var NoProto = NoProto || {};

NoProto.Shape = (function(){
  var thing = function(name){
    var privateData = 'this is a ' + name;

    var self = this;
    this.base = function(){
      return self;
    };

    this.doStuff = function(){
      return privateData;
    };
  };

  return thing;
})();

NoProto.Square = (function(){
  var thing = function(colour){
    NoProto.Shape.call(this, "square");
    const oldDoStuff = this.doStuff;
    this.doStuff = function(){
      var val = oldDoStuff();
      return val + ', which is '+ colour;
    };
  };

  thing.prototype = Object.create(NoProto.Shape.prototype);

  return thing;
})();

var noProtoSqr = new NoProto.Square('blue');
try {
  console.log(noProtoSqr.doStuff()); // ---> Stack Overflow!
} catch (e){
  console.error('There was an error: ' + e);
}
1
CertainPerformance 21 सितंबर 2018, 14:00