Наследование Prototypal: действительно ли можно ли объединить Object.create в цепочку?

Я плохо знаком с prototypal наследованием, таким образом, я пытаюсь понять 'правильный' путь. Я думал, что мог сделать это:

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");

Но вместо этого я добираюсь "tbase. BicData.prototype не определен"

В Java говорят, что я хочу, должен иметь Tdata как шаблон 'интерфейс', BicData, чтобы быть реализацией того что и затем инстанцировать объектов от него.

Где я иду не так, как надо?

6
задан Kevin Brown 20 February 2015 в 02:11
поделиться

1 ответ

Проблема в том, что tbase.BicData является объектом ( tbase.BicData = Object.create (tData); ), а свойство prototype должно использоваться в функциях-конструкторах.

Воспользовавшись методом Object.create , я бы сделал что-то вроде этого:

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
8
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: