javascript:原型链

  • 原型:构造函数.prototype/实例化对象.proto

    自定义对象中 构造函数直接写对象的话 会造成内存浪费,创建两个对象方法是一样的 但是是不同内存地址

    如果在全局创建函数,然后构造函数中赋值,可以避免内存浪费,但会造成另一个现象就是全局污染

    所以我们一般通过原型添加方法,可以避免函数全局污染 内存重复浪费的问题

    实例对象._proto_(一般以__开头的属性都是不希望被访问的私有属性) 属性是浏览器的隐藏(私有)属性,存在兼容问题,一般测试的时候使用,不建议通过这个属性去给原型添加属性

  • 构造函数:原型.constructor

  • 实例化对象:new 构造函数

    实例对象找属性或方法会先从自身找,如果找不到会从原型链一层一层找,找到则返回,到最后都找不到 返回undefined

  • 完整版原型链

绘制完整版原型链的目的是辅助大家理解js中对象的继承关系。

总结:

  1. 所有函数都是new Function创建出来的,因此所有函数.__proto__都是Function.prototype
  2. 所有对象都是new Object创建出来的,因此所有对象.__proto__都是Object.prototyp
  3. 上方是通过构造工厂函数创造出的实例对象,下方是手动直接创建对象
  4. 构造函数可以当作构造函数去生成实例对象来看,也可以当作实例对象被别的构造函数生成来看
  5. 构造函数Function是个特例,可以自己生成自己
  • 对象.hasOwnProperty("属性或方法名")

    判断属性或方法是否是在对象本身(原型链找的不算)

    返回:ture or false

  • "属性或方法名" in 对象

    判断属性或方法能否访问到(原型链能找到的都算)

    返回:ture or false

遍历对象自身成员

for( var k in p){
    console.log(k); //打印原型链上所有的成员
    if(p.hasOwnProperty(k)){
        console.log(k); //打印自身的成员
    }
}
posted @ 2021-03-08 13:45  镜像山海  阅读(115)  评论(0)    收藏  举报