js的原型链

原创 Luna325 教程 js 209阅读 2017-12-14 15:30:19 举报

用markdowm写的直接粘过来,如果看着不方便,请打开下面链接看

http://note.youdao.com/noteshare?id=03444bd9def20ea00a7fe59a8e7660a8&sub=A656A58985EE493D94977D574C32012B

js原型

没有原型的对象为数不多,Object.prototype就是其中之一,不继承任何属性。
其他的原型对象都是普通对象,都有原型。
所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。

var A = function () {}

var B = new A();

这个代码说明了对象B是函数A生成的,函数和对象就是鸡和蛋的关系,
但是因为最终倒腾到根上的话,Object是祖师爷,所以函数属于对象。
JS里面所有的东西都是对象,对象就是属性的集合。

所有的对象上都有一个proto属性,
一个对象,首先你要知道它是谁new出来的,
对象的proto指向new它的函数的prototype属性;

那么函数A是谁new出来的?
函数也是对象,所以它也有proto属性
函数A是Function生成的,所有函数都是Function new出来的。

下面是最核心的东西了:函数A的prototype是谁new出来的??

A.prototype是一个对象,它有一个

属性,它是由Object函数new出来的
所以

Object.prototype是谁创建的??

so,这个链条是这样的

是串起来这个链条的一个隐形属性,有些浏览器是访问不到这个属性的
so,B可以调用A.prototype上的任何属性,同样可以调用Object.prototype上的任何属性

这就是原形链,这就是为什么B可以直接调用toString方法,因为toString是Object.prototype的方法

那么你可以在链条上的任何一个函数的prototype上添加东西,来测试一下B能不能访问

答案是可以的 比如 Object.prototype.me = "cute";
console.log(new Date().me)
// "cute";
console.log(toString().me)
// "cute"

所以为了避免变量污染,实际用途中要避免修改原型链上的属性,而是在实例上做修改。

原型的继承

js对象具有“自有属性”,也有一些属性是从原型对象继承而来的。

假设要查询对象obj的属性 x,
如果obj中不存在 x,那么将会在 o的原型对象中查询属性x。
如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上查询,直到找到x或者查找到一个原型是null的对象为止。

如果找不到 返回 undefined

由此可以看到,对象的原型属性构成了一个“链”,通过“链”来实现属性的继承。
谈谈我对js原型链的理解,抛砖引玉。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复