隐藏属性—原型
在JS每个对象中,都有一个隐藏属性,这个隐藏属性存储着其共有属性组成的对象的地址,这个公共属性组成的对象叫原型!
- 原型:公共属性组成的对象。
- 原型的地址:隐藏属性存储着原型的地址。
如以下代码:
let obj = {}
obj.toString() //该代码不会报错
该代码不会因为obj对象里面没东西而报错,那是因为obj对象有个看不见的隐藏属性,该隐藏属性对应的对象有 toString()
,所以不会报错!
原型
每个对象都有原型,原型里面存储着对象的共有属性,比如obj的原型就是一个对象,而这个对象的地址由 obj.__proto__
存储。
注意:对象的原型也是原型,也就是说原型也有原型!那最终的原型的原型是什么?答案是null
修改增加共有属性
注意:无法通过自身修改或增加共有属性!
如:
let obj = {}, obj2 = {} //共有属性toString
to.toString = 'xxx' //只会在修改obj自身属性
obj2.toString //还是在原型上
当然,还是可以修改的,但不推荐这么做,否则会引出很多问题:
obj.__proto__.toString = "xxx" //不推荐使用__proto__
Object.prototype.toString = 'xxx'
指定一个对象的原型是哪个对象
虽然不能修改原型,但是可以自己创建一个对象作为别的对象的原型,如:
//不推荐使用__proto__
let obj = {name: 'frank'}
let obj2 = {name: 'jack'}
let common = {kind: 'human'}
obj.__proto__ = common
obj2.__proto__ = common
//推荐使用Object.create
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'