JS原型链

来源:互联网 发布:简述java类加载机制 编辑:程序博客网 时间:2024/06/03 09:10
原型(prototype)
我们每次创建一个函数浏览器都会为函数添加一个属性叫做prototype(显示原型),这个属性对应的是一个对象这个对象就是我们说的原型对象。以函数的形式去调用函数,则原型对象没有任何作用。
当以构造函数的形式调用函数时,它所创建的对象中都会有一个隐含的属性
执行该函数的原型对象,我们可以通过实例对象__proto__来访问这个对象。
通过同一个构造函数new出来的对象可以说是一个类型的对象,他们都共享同一个原型对象,这个原型对象就相当于一个公共的区域当我们去调用一个对象的属性或方法时,它会先去对象自身中寻找,如果找到了则直接使用,如果没找到则去原型对象中寻找,如果原型中有则返回原型中的值,如果原型中没有,则去原型的原型中寻找,找到了则直接使用依次类推。。。
注意:Object的原型的原型为null,所以会一直找Object的原型,
如果他里面依然没有,则返回undefined
我们可以将对象中共有的属性或方法统一添加到原型中,
这样我们不用添加多个重复的属性或方法,也不会污染全局作用域。
1. 函数的prototype属性
* 每个函数都有一个prototype属性, 它默认指向一个对象(即称为: 原型对象)
* 原型对象中有一个属性constructor, 它指向函数对象
2. 给函数原型添加属性(一般都是方法)
* 作用: 函数的所有实例对象自动拥有原型中的属性(方法)

显示原型与隐式原型
原型链
原型链
Function是通过new自己产生的实例对象
Function.__proto__type=Function.protoype;
Object是Function的实例
Object.__proto__=Function.prototype
没有我们定义属性的对象是空对象 原型对象就是一个空对象
原型对象是Object的实例
prototype.__proto__=Object.prototype
所有函数均是Function的实例
fun.__proto__=Function.prototype
所有的函数都有 prototype
所有的对象都有 __proto__
5. 总结:
函数的prototype属性: 在定义函数时自动添加的, 默认值指向一个空Object对象
对象的__proto__属性: 创建对象时自动添加的, 默认值为构造函数的prototype属性值
程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)
instanceof是如何判断的?
表达式: A instanceof B
如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false
0 0
原创粉丝点击