6

I'm new to prototypal inheritance so I'm trying to understand the 'right' way. I thought I could do this:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

var tbase = {};

tbase.Tdata = function Tdata() {};

tbase.Tdata.prototype.say = function (data) {
    console.log(data);
};

var tData = new tbase.Tdata();

tbase.BicData = Object.create(tData);

tbase.BicData.prototype.say = function (data) {
    console.log("overridden: " + data)
};

tbase.BicData.prototype.shout = function (data, temp) {
    console.log("SHOUT: " + data + ", " + temp)
};

var test = new tbase.BicData();

tData.say("test1"); 
test.say("test2");
test.shout("test3", "hope");

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

var tbase = {};

tbase.Tdata = function Tdata() {};

tbase.Tdata.prototype.say = function (data) {
    console.log(data);
};

var tData = new tbase.Tdata();

tbase.BicData = Object.create(tData);

tbase.BicData.prototype.say = function (data) {
    console.log("overridden: " + data)
};

tbase.BicData.prototype.shout = function (data, temp) {
    console.log("SHOUT: " + data + ", " + temp)
};

var test = new tbase.BicData();

tData.say("test1"); 
test.say("test2");
test.shout("test3", "hope");

But instead I get "tbase.BicData.prototype is undefined"

In Java speak, what I want is to have Tdata as a boilerplate 'interface', BicData to be an implementation of that that, and then to instantiate objects from it.

Where am I going wrong?

Kevin Brown-Silva
  • 40,873
  • 40
  • 203
  • 237
robinhowlett
  • 173
  • 9

1 Answers1

8

The problem is that tbase.BicData is an object (tbase.BicData = Object.create(tData);), and the prototype property should be used on constructor functions.

Taking advantage of the Object.create method, I would do something like this:

var tbase = {};

tbase.Tdata = {
  say : function (data) {
    console.log(data);
  }
};

tbase.BicData = Object.create(tbase.Tdata);

tbase.BicData.say = function (data) {
    console.log("overridden: " + data)
};

tbase.BicData.shout = function (data, temp) {
    console.log("SHOUT: " + data + ", " + temp)
};

var test = Object.create(tbase.BicData);
var tData = Object.create(tbase.Tdata);

tData.say("test1"); // test1
test.say("test2"); // overridden: test2
test.shout("test3", "hope"); // SHOUT: test3, hope
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
  • 1
    I think most of the OP's confusion would be avoided if the OP hadn't mixed `new` and `Object.create`. I say pick one and stick to it. – Ruan Mendes Feb 02 '12 at 09:05