原型与原型链

来源:互联网 发布:国际网络推广工程师 编辑:程序博客网 时间:2024/04/27 13:40

原型有两种:

1为显示原型,2为隐式原型

1.    显示原型

a)     Prototype

b)     每个函数都有一个显示原型prototype当然函数也有隐式原型

c)     原型就是函数的一个属性,这个属性名叫做prototype

d)     这个属性即prototype的类型是object

2.    隐式原型

a)     __proto__

b)     每个对象都有一个隐式原型,并且没有显示原型,函数这个一等公民除外.

c)     __proto__也是函数的一个属性

d)     类型仍然是object

一个特殊的存在函数对象:既是对象又是函数,所以他又有prototype又有__proyo__

什么是函数对象   

       就是这样的 var f = new Function;他console.dir的时候他两个都存在

       而 var ff = new String;               他console.dir的时候只存在__proto__

懵逼了,函数真TM 是一等公民. 变量. 对象, 函数

       函数是既有prototype又有__proto__的

       显示原型与隐式原型的关系,个人理解:把构造器当老子,他们创建的对象就是儿子.每个老子的显示原型等于他们的每个儿子的隐式原型.就是老子的显性基因,都传给儿子了,变成儿子的隐式基因,并且是完全相等的.而且,这些儿子很坑爹,他们的其中一个添加了什么基因,他们老子也会被添加上,而老子添加上了,所有的儿子也都会被添加上,


当然,如果你想控制,让某个儿子的东西不影响家里其他人.你可以动他的自有属性,计算机在查找这个属性时,会优先查找自有属性,自有找不到才会查找原型属性

计算机在对象中找属性的具体方法是:

1.    找自有属性.找到返回.

2.    找不到.找隐式原型.找到返回

3.    找不到,找隐式原型的隐式原型,找到返回,找不到,则继续找隐式的隐式的隐式

4.    整个过程就是obj.__proto__.__proto__ 这个过程中,只要找到就不往下找了,然后返回值,最上级,就是到顶的一个是null

5.    如果都没有找到,返回undefined

 当然.我们在平时使用的时候,__proto__是可以省略的,所以他叫隐式原型

应用:

比如说,我们创建了一个动物类.可以添加一些属性到显示原型中.这样我们创建对象的时候,所有的对象都有了这个属性.

再比如,数组,除了系统自己定义的属性外,我们绝对还不够,我们希望有一个属性,可以让数组中重复的数字删除.我们就可以给Array这个构造器的prototype显示原型添加一个属性.这样以后不管你什么时候创建了一个数组,只有你new Array 你就可以使用这个属性,
原创粉丝点击