前言
在JavaScript(JS)的学习过程中,我们会接触到各种框架(Ext, JQuery等),在这些框架中为你封装了各种功能,有自定义的类型进行扩展,也有对原有的类型进行功能扩展,在JS开发中也使用了面向对象的思想,但是,在JS中是没有”类“这种类型的,也就没有了extends和implement这些关键字的,所以为了模拟出这些行为,我们需要用到JS中的一个特殊而强大的属性--prototype,下面我们将进行进一步解析,知识有限,有误的地方,欢迎指正。
1.prototype说明
在JS中,任何对象都是有这个属性的,无论是对象还是定义对象的函数都是存在的。在进一步解释之前,我们需要说明一点,在JS中是没有真正的类的,所以不要一上来就有Java中类这个概念,(我的东西就是我的,不会继承给别人)。那么在JS中方法类型就可以分为两种:
1)对象方法(Function看做是一个特殊的对象),在对象中声明的方法
2)prototype方法 在prototype中声明的方法
2.prototype类型
prototype可以分为两种类型,一种是显示的prototype记为prototype,另一种是隐式的prototype记为__proto__,在对象变量中存在的是__proto__这种隐式的属性,而在Function声明的变量中存在的是prototype这种显示的属性,我们可以进行简单的测试,来进一步说明:
function A(){}//A是一个Fucntion类型,我们称为函数
var a=new A();
alert(A.prototype);//存在,是一个对象类型的,调用toString(),方法返回字符串
alert(A.__proto__);//存在,它的是一个Function.prototype对象
alert(a.prototype);//不存在,为定义
alert(a.__proto__);//存在指向A.prototype对象
在此要进一步说明一下A.__proto__的存在,
(图片制作技术有点渣,不要介意)
为什么Object会有__proto__属性指向Function.prototype对象呢?
为什么Object会有__proto__属性指向Function.prototype对象呢?
我们可以发现当我们
alert(Object);时,输出的是
function Object() {
[native code]
}
说明Object是由function声明产生的,同样的我们测试alert(Function)时,输出的是
function Function() {
[native code]
}
所以可以解释Object.__proto__&&Function.__proto__
O1和F1的__proto__指向Object和Function的prototype对象
特别说明,只有Object.prototype.__proto__==null,(前提是你没有修改原有的__proto__属性),并且prototype是一个对象,里面包含一些属性,最常见的是constructor属性。
基本上我们将prototype的机制说了一下,其实上面的图片就是原型链,大概的内容就是这些了,关于模拟继承,以及原型机制,将在下一章节解析,欢迎大家来讨论,指正。