prototype 和 length
函数的属性和方法
ECMAScript 中函数是对象,因此也有属性和方法。每个函数都有两个属性,length 和 prototype 其中length 表示希望接收的命名函数参数的个数。
length 属性
下面的代码就是说的 length 属性,比较简单,没啥好说的。
function box(a,b,c){
return d=(a+b)/c;
}
box(1,2,3);
document.write(d+"<br/>");
document.write(box.length+"<br/>");
prototype 属性
然后我们看看 prototype 属性。
对于 prototype 的理解下面的例子觉得很不错。
提问:对于下面的代码有
function a(){this.name="你好";this.age="25";}
a.prototype.b=function (){alert("hello world")};
上面代码的意思是不是说:在a函数的对象原型(也就是对象Object)上添加一个b()方法呢,这样子a函数就可以继承了??也就是说可以用这样的一段代码代替
a.b=function(){alert("hello world")}
回答:这样语法是没有错误的。a.b = function(){...}是可以的,但是这样的话,如果有一百个a”对象“,那么你的100个a上面就有100个b方法。可是,你如果在原型上设置b方法,那么这100个a都只共享着一个b方法,这样一来可以节省内存,二来更具有”面向对象”的潜质。
而 prototype 有两个方法, apply 和 call 。
二者的区别: While the syntax of this function is almost identical to that of call(), the fundamental difference is that call() accepts an argument list, while apply() accepts a single array of arguments.
看看下面的例子:
function cat(){
}
cat.prototype={
food:"fish",
say: function(){
alert("I love "+this.food);
}
}
var blackCat = new cat;
blackCat.say();
但是如果我们有一个对象 Dog = {this.food="bone"},我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 blackCat 的 say 方法:
function cat(){
}
cat.prototype={
food:"fish",
say: function(){
document.write("I love "+this.food+"<br/>"+"<br/>");
}
}
var blackCat = new cat;
blackCat.say();
var yellowCat= new cat;
yellowCat.say();
function Dog(){
this.food="bone";
}
var dog = new Dog();
blackCat.say.call(dog);
所以,可以看出 call和 apply 是为了动态改变 this 而出现的,当一个 object 没有某个方法,但是其他的有,我们可以借助 call 或 apply 用其它对象的方法来操作。
网友评论