function 函数类型之prototype

prototype 和 length

函数的属性和方法

ECMAScript 中函数是对象,因此也有属性和方法。每个函数都有两个属性,lengthprototype 其中length 表示希望接收的命名函数参数的个数。

length 属性

下面的代码就是说的 length 属性,比较简单,没啥好说的。

function box(a,b,c){
return d=(a+b)/c;
}
box(1,2,3);     
document.write(d+"
"); document.write(box.length+"
");
function 函数类型之prototype_第1张图片

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 有两个方法, applycall
二者的区别: 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();
function 函数类型之prototype_第2张图片

但是如果我们有一个对象 Dog = {this.food="bone"},我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 blackCat 的 say 方法:

function cat(){
}
cat.prototype={
food:"fish",
say: function(){
document.write("I love "+this.food+"
"+"
"); } } 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);
function 函数类型之prototype_第3张图片

所以,可以看出 callapply 是为了动态改变 this 而出现的,当一个 object 没有某个方法,但是其他的有,我们可以借助 call 或 apply 用其它对象的方法来操作。

你可能感兴趣的:(function 函数类型之prototype)