美文网首页
function 函数类型之prototype

function 函数类型之prototype

作者: 程咸菜 | 来源:发表于2016-10-12 17:36 被阅读0次

prototype 和 length

函数的属性和方法

ECMAScript 中函数是对象,因此也有属性和方法。每个函数都有两个属性,lengthprototype 其中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 有两个方法, 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();

但是如果我们有一个对象 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);

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

相关文章

网友评论

      本文标题:function 函数类型之prototype

      本文链接:https://www.haomeiwen.com/subject/ewviyttx.html