扩展javascript函数继承数组

时间:2013-05-26 09:21:36

标签: javascript

我有一些javascript代码如下所示

function extends(Child, Parent) {
    var F = function() {
    };
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

function Parent() {
    this.cardArray = [];
}

function Child() {

}
然后我打电话给

extends(Child , Parent);  
var a=new Child();

报告

 a.cardArray is undefined

您的评论欢迎

1 个答案:

答案 0 :(得分:3)

那里有两个问题:

首先,您不能将extends用作函数名称(除非您使用严格模式并且仅在支持严格模式的环境中运行代码)。它是松散模式下的保留字。 (它目前不是使用并且不太可能,但它是保留的。)

第二个,更重要的是,你没有在任何地方调用 Parent,所以很自然地,这个属性从未添加到对象中。您需要在Parent内拨打Child以获取其设置的内容,并且您需要执行此操作,以便在this的调用中Parent正确无误。我们可以通过Function#call执行此操作,这样我们就可以调用一个函数来指定this应该是什么(在我们的例子中,我们希望它在调用{this时与Child相同1}}):

function Child (){

    Parent.call(this);
}

总而言之,删除了不正确(但无害)的分号,并且extends更改为未保留的内容,并且缩进一致,我们得到:

Live Copy | Live Source

function extend(Child, Parent) {

    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

function Parent (){

    this.cardArray=[]; 
}

function Child (){

    Parent.call(this);
}

extend(Child, Parent);

var a = new Child();

console.log("typeof a.cardArray = " + typeof a.cardArray);

...显示“typeof a.cardArray = object”,这是正确的。


请注意,真正有效的JavaScript继承需要(目前)相当多的管道。你有很多,但不是全部。 (例如,对父方法的调用很尴尬。)我已经完成了very small library called Lineage为您完成所有管道工作,FWIW。