Javascript继承:推送未定义

时间:2017-07-23 06:50:29

标签: javascript oop inheritance

testA = function(){
this._data = [];
}

testA.prototype.add = function(data){
this._data.push(data) // Here i am facing this._data is undefined
}


testB = function(){}
testB.prototype = Object.create(testA);
var instance = new testB;

testB.prototype.pushData = function(data){
instance.prototype.add(data); 
}

function (data){
  instance.prototype.add(data); 
}
instance.pushData("someData")

在上面的javascript片段中,我面临'无法读取属性'推送'未定义'错误

我的继承概念是错的吗?任何人都可以帮助解决这个继承问题

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误/不准确之处:

  1. 这样编写以保持原型继承更为清晰

    testB.prototype = Object.create(testA.prototype);
    
  2. 使instance对象具有您必须调用的_data属性 首先是testA中的testB(父级)。

    testB = function() { testA.call(this); }
    
  3. 我不知道你的意思,但这个功能看起来很奇怪:

    function (data){ instance.prototype.add(data); }
    
  4. testB内,您可以使用this来引用父(testA)的属性,以便调用add()函数:this.add(data);此函数将首先在testB的属性中进行搜索,然后在testB原型对象中的__proto__ testA引用中进行搜索(参见上面第1点)。
  5. 最后它们可能看起来像这样:

    testA = function() {
        this._data = [];
    }
    testA.prototype.add = function(data){
        this._data.push(data);
        //console.log(this._data);
    }
    
    testB = function() {
        testA.call(this);
    }
    testB.prototype = Object.create(testA.prototype);
    testB.prototype.pushData = function(data){
        this.add(data); 
    }
    var instance = new testB();
    instance.pushData("someData");
    console.log(instance._data);

    <强>更新

    testA = function() {
        this._data = [];
    }
    testA.prototype.add = function(data){
        var data = data + ' from parent testA';
        this._data.push(data);
    }
    
    testB = function() {
        testA.call(this);
    }
    testB.prototype = Object.create(testA.prototype);
    testB.prototype.add = function(data){
        testA.prototype.add.call(this, data); // call to parent's add(); data is passed to the parent's add() function too.
    // now you can do some actions intended for testB like:
        var data = data + ' from child testB';
        this._data.push(data);
    }
    var instance = new testB();
    instance.add("someData");
    console.log(instance._data);

    你也可以这样做:

    var a = new testA(); 
    a.add(); // add() in testA prototyp is called
    var b = new testB(); 
    b.add(); // add() in testB prototyp is called
    

    如果不创建testA实例,您可以从任何地方调用其add()方法,如下所示:

    testA.prototype.add.call(context, data);
    

    总结一下,有3个选项(实际上是2):创建testA的实例并调用它的add(),从testB的add()调用testA的add()并使用call()调用testA的add() /应用()。

    有一些非常聪明的OOP模式允许您在一个对象中引用另一个对象并进行一些奇特的调用。但这是一个很大的话题(OOP),我认为这超出了这个问题的范围。