JavaScript原型和原型链

108 阅读2分钟

原型

每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性

原型链

原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链
它解释了为何一个对象会拥有定义在其他对象中的属性和方法
这些属性和方法定义在Object的构造器函数(constructor functions)之上的prototype属性上,而非对象实例本身

通过示例来了解原型和原型链:先创建一个对象obj

var obj = { name: 'obj' } 

可以对obj进行一些操作

读   属性
新增 属性
更新 属性
删除 属性

为什么obj有valueOf和toString属性

在我们没有对 obj 进行任何其他操作之前,发现obj已经有几个属性(方法)了

我没有给obj.valueOf赋值,valueOf/toString是怎么来?使用console.dir打出对象的属性 console.dir(obj) 打出来的结果是

1  obj 本身有一个属性 name       (这是我们给它加的)
2  obj 还有一个属性叫做 __proto__(它是一个对象)
3  obj.__proto__ 有很多属性,包括 valueOf、toString、constructor 等
4. obj.__proto__ 其实也有一个叫做 __proto__ 的属性(console.log 没有显示),值为 null

obj 为什么会拥有 valueOf / toString / constructor 这几个属性

这跟 __proto__ 有关
当我们「读取」 obj.toString 时,JS 引擎会做下面的事情

1 看obj 对象本身有没有toString属性,没有就走到下一步
2 看obj.__proto__ 对象有没有toString属性,发现 obj.__proto__ 有toString属性,于是找到了
所以obj.toString实际上就是第2步中找到的obj.__proto__.toString

上面的过程,就是读属性的搜索过程

这个搜索过程是连着由 __proto__ 组成的链子一直走的,这个链子,就叫做原型链

详细资料点击:继承与原型链