原型和原型链

316 阅读2分钟
定义一个函数 test
function test (){
    this.age = 10
}

prototype 函数的一个属性 我们可以理解为 函数的原型属性
test.prototype

object对象,自带一个__proto__属性 (指针)

举例 new 关键字实例化对象
let a = new test()

a 是一个实例化的对象  test这个时候,就是实例化a对象的构造函数

当我们打印
console.log(a)
输出的结果是
{
  constructor :fn test(),
  __proto__
}
constructor 对应的值就是test()构造函数
a.__proto__ === test.prototype
a的指针  等于我们test构造函数的 prototype(原型属性)
实例对象 a 它的原型就是我们test构造函数的prototype(属性)


test.prototype 他虽然是 a 实例的原型  但是他本身也是一个对象

{
    constructor :fn Object(),
    __proto__
}

他也拥有__proto__ 指针   __proto__指向的是函数test 自己的原型 object.prototype
为什么这么讲

consturctor 这个构造器的值 就是一个fn函数  Object

当我们输出cosnole.log(test.prototype.__proto__) 的结果时

{
    constructor:fn Object()
}

但是这个{ } 中是没有 __proto__ 属性的 也就是说这个是我们这个原型链上的最上级 

当你输出 object.prototype.__proto__ 时 返回的值为null


实例 a.__proto__ === test.prototype
     test.prototype.__proto__ === object.prototype
     a 的原型是 test.prototype  
     test 的原型是  object.prototype
     他们之间都通过 __proto__ 进行链接
     就形成了原型链的关系
     
     test函数中有一个值 为this.age = 10 
     这个属性会被保存到test.prototype属性中
     
     而a对象是通过new test() 得到的,那么a实例拥有age属性
     console.log(a.age) //输出的结果为10
     这个是通过原型的关系实现的继承就叫原型继承
     
     object.prototype.name = '小铭'
     console.log(a.name) //输出结果为 小铭
     这种就是通过原型链实现的继承 __proto__
     实例a 在 test.prototype 中没有找到name  
     但是在 test.prototype.__proto__指向的object.prototype 属性中找到了name值
     实例和属性值之间存在间接的关联 这种属于原型链的继承
     
     判断一个属性是否在实例中可以使用
     console.log(a.hasOWNproperty('name')) 如果这个属性在实例上 就返回true 否则返回false
     
     判断一个属性是否在实例的原型链上面使用
     console.log('name' in a) 如果在原型链上返回true  否则返回false
     

   
     ```