原型
每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性
原型链
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链
它解释了为何一个对象会拥有定义在其他对象中的属性和方法
这些属性和方法定义在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__ 组成的链子一直走的,这个链子,就叫做原型链
详细资料点击:继承与原型链