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片段中,我面临'无法读取属性'推送'未定义'错误
我的继承概念是错的吗?任何人都可以帮助解决这个继承问题
答案 0 :(得分:0)
您的代码中存在多个错误/不准确之处:
这样编写以保持原型继承更为清晰
testB.prototype = Object.create(testA.prototype);
使instance
对象具有您必须调用的_data
属性
首先是testA
中的testB
(父级)。
testB = function() { testA.call(this); }
我不知道你的意思,但这个功能看起来很奇怪:
function (data){ instance.prototype.add(data); }
testB
内,您可以使用this
来引用父(testA
)的属性,以便调用add()
函数:this.add(data);
此函数将首先在testB
的属性中进行搜索,然后在testB
原型对象中的__proto__
testA
引用中进行搜索(参见上面第1点)。最后它们可能看起来像这样:
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),我认为这超出了这个问题的范围。