prototype属性是您有能力向对象添加属性和方法;
先介绍一个下面要用到的函数,JSON.stringify(value)。
这个函数的作用是:把传入的参数value(对象或者数组)变成字符串,它有三个参数,第一个参数是必须的,其余的两个参数可填可不填。
var ob = { };//超级简单的空对象 alert(JSON.stringify(ob.prototype));
它alert的东西是undefined,也就是说object这个属性prototype不是个东西
我可以很明白的告诉你,prototype绝对不是给对象用的,对象根本没办法引用prototype这个属性,它真正的属主,其实是函数
记住,能够引用prototype的东西绝对是函数
prototype是函数的一个属性,是函数的原型对象。prototype只能够被 函数 调用。
//首先定义一个有名函数func function func(){ } alert(func.prototype);
返回的就是对象
prototype是函数的一个属性,也是函数的原型对象,而这里func函数引用prototype的时候返回的是一个对象object的,那么,结合这两个概念,你能得出什么结论呢?我想通过这不难得出结论:
function func(){ } alert(JSON.stringify(func.prototype));
alert的结果是一个空对象
function func(){ } func.prototype.name ='prototype是函数的的属性,本质是函数的原型对象'; alert(JSON.stringify(func.prototype))
因此,这里得出结论:prototype是函数的的属性,本质是函数的原型对象。
别以为js中只有对象才有属性,通过这里,我们也可以知道,其实js的函数也是有属性的,而且js的函数好像就只有这个属性prototype,而且js的这个函数属性同时还是函数的原型对象
为什么说prototype是函数的一个属性呢?因为,只有函数才能调用prototype,而且是以这样的方式func.prototype调用的,这样的方式调用东西是不是和对象调用属性一模一样呢?是的,就是因为函数调用prototype的时候是和对象调用属性的时候一样的,我们才把prototype说成是函数的一个属性,而函数的这个属性其实是一个对象(这个是不是对象,上面已经证明了,这里就不再说明),所以说,这个prototype就是函数的属性,本质是函数的原型对象。
这里为什么强调说prototype的本质是函数的原型对象呢?
下面看代码证明,我的代码很简单的:
//定义一个函数 function func(){ } //给函数的属性prototype赋予一个方法get func.prototype.get=function(value){ return value;//很简单,你给我什么我就输出什么 }
你说,怎么调用上面那个get方法?
我给你一点提示,get是属于func函数的一个属性函数,既然是属性函数,那么我们怎么调用呢?
很简单,属性函数必须由它的对象来调用,那么我们怎么获取get的对象呢?很简单,用关键字new来实例化func函数的对象就行了吗?是吧?
没错,用func函数实例化出来的对象ob1,确实能够调用get函数,上面已经利用ob1调用get函数alert出来了,这就证明func函数的实例对象是拥有get这个属性函数的
特别指出:
Array.prototype是一个数组
String.prototype是一个字符串
Object.prototype是一个对象
这三个特殊例子,不像构造函数的prototype一样
下面,实例化func函数的一个对象ob1:
var ob1 = new func(); //用func实例化出来的对象来调用get属性函数 alert(ob1.get('hello,prototype原型对象'));
要想深入理解可以看下一篇文章 深入理解js的prototype以及prototype的一些应用