日期:2014-05-16  浏览次数:20324 次

我自定义类想继承Array类,请问apply加new Array()方法怎么不行啊?
JScript code

var myArray=function(){
   Array.apply(this,arguments);
};
myArray.prototype=new Array();
arr=new myArray(1,2,4) 


请问上面这样写为什么不行?上回一朋友提供了种方法:
JScript code

var myArray=function(){
   var x=Array.apply(null,arguments);
   for(var p in x)this[p]=x[p];
   this.length=x.length;
};
myArray.prototype=new Array();
arr=new myArray(1,2,4)
alert(arr)


谁能说说为什么这么写就可以了?

------解决方案--------------------
你原来的方法不对,我估计是 Array.apply(this,arguments);这句继承的时候Array对象里面的属性和方法应该有显式的定义。

下来的例子就可以:
function Person(name,age) 
{
this.name = name||"default name" ;
this.age = age||"default age" ;
this.showPerson = function()
{
alert("Person类:name="+this.name+" ,age="+this.age);
}
}
 
function Student(name,age,grade)
{
Person.apply(this,arguments);//继承Person的属性和方法 call也可以,但是参数不是数组格式 Person.call(this,name,age)
this.grade = grade ;
this.showStudent = function()
{
alert(" student类:grade="+this.grade);
}
}
var student = new Student("bury","15",'2');
student.showPerson();
student.showStudent();




------解决方案--------------------
探讨

楼主,你下面那个方法是我写的,我又试了半天,貌似不行,Array、Date、RegExp这几个对象用原型链方式继承我都没成功……(其他的没试)。猜想你可能想给数组添加什么方法吧,我一般都直接写Array.prototype.xxx=functiong(){...}。如果项目急就暂时先不考虑如何成功继承了,有空再研究研究吧。

PS:求专家指导javascript定义数组、时间时内部到底做了写……

------解决方案--------------------
构造器 是用new调用的,普通函数是用()调用的,fun.apply(obj,args)的具体执行过程可以这样理解:
 obj.temp=fun;
 obj.fun(args);
 delete obj.fun;