隐藏属性—原型

在JS每个对象中,都有一个隐藏属性,这个隐藏属性存储着其共有属性组成的对象的地址,这个公共属性组成的对象叫原型!

  • 原型:公共属性组成的对象。
  • 原型的地址:隐藏属性存储着原型的地址。

如以下代码:

  1. let obj = {}
  2. obj.toString() //该代码不会报错

该代码不会因为obj对象里面没东西而报错,那是因为obj对象有个看不见的隐藏属性,该隐藏属性对应的对象有 toString() ,所以不会报错!

原型

每个对象都有原型,原型里面存储着对象的共有属性,比如obj的原型就是一个对象,而这个对象的地址由 obj.__proto__ 存储。
注意:对象的原型也是原型,也就是说原型也有原型!那最终的原型的原型是什么?答案是null

修改增加共有属性

注意:无法通过自身修改或增加共有属性!

如:

  1. let obj = {}, obj2 = {} //共有属性toString
  2. to.toString = 'xxx' //只会在修改obj自身属性
  3. obj2.toString //还是在原型上

当然,还是可以修改的,但不推荐这么做,否则会引出很多问题:

  1. obj.__proto__.toString = "xxx" //不推荐使用__proto__
  2. Object.prototype.toString = 'xxx'

指定一个对象的原型是哪个对象

虽然不能修改原型,但是可以自己创建一个对象作为别的对象的原型,如:

  1. //不推荐使用__proto__
  2. let obj = {name: 'frank'}
  3. let obj2 = {name: 'jack'}
  4. let common = {kind: 'human'}
  5. obj.__proto__ = common
  6. obj2.__proto__ = common
  7. //推荐使用Object.create
  8. let obj = Object.create(common)
  9. obj.name = 'frank'
  10. let obj2 = Object.create(common)
  11. obj2.name = 'jack'