• 对象进阶原型和原型链之基础认知


    对象进阶原型和原型链之基础认知

    看了很多关于原型和原型链的讲解,基本都是用代码解释,但是对于新手来说,我觉得直接用白话文来解释或许更加的合适。
    原型链:proto 这个我们在平时打印时可以经常能够看到 那么这个东西具体代表的是什么呢?

    • 原型链就是继承关系(继承就是父类有的,子类也有),如果说a的原型链是什么,那么就是它的父类,原型链上的方法,就是它的父类的方法。
    • 原型:原型就是某一个对象,下面有很多继承于它的对象,对这些对象来说,这个父类对象就是他们的原型。
    • 对于最顶级对象(没有继承其他的)的原型链,其__proto__(原型链)的值是null,别的对象的__proto__都是取继承对象的方法

    上面的白话文说的应该很清楚了,但是为了更加清晰,我使用代码加注释的方法来展示

    class Box{
    constructor(){
    
    }
    play(){
    
    }
    run(){
    
    }
    }
    var b=new Box();
    b.abc=function(){
    
    }
    console.log(b);      //Box{abc:f}  abc是实例化b的方法 所以打印的时候直接显示出来,而点开__prpto__查找原型链的方法,会发现play和run方法,说明原型链就是继承
    console.log(b.__proto__);   //Box{}   实例化的原型就是Box(类)
    //在类中,只有类似play()这种方法,才是实例化后原型链上的方法,其余的属性都是对象属性,不属于原型链上的方法
    

    对象的创建

    对象的创建有三种方式:字面量创建,构造函数创建,原型创建对象

    //字面量创建   var obj={a:1,b:2}
    //构造函数创建   var obj=new Object()   
    //原型创建对象
    var o={a:1};
    var o1=Object.create(o);  //以o为原型创建o1,o2 
    var o2=Object.create(o);
    o.a=10;
    o1.a=100;
    console.log(o1.a,o2.a.o1);  //100   10   
    //o中的a本来是对象属性,不是原型链下的,但是以o为原型创建后,对于子类来说a的所有属性都是原型链下的属性,
    //子类改变属性值,不会影响原型链上的属性值,但是原型链上的属性改变后,子类也会跟着改变
    
    //可以通过子类改变原型链上的属性
    o1.__proto__.a=100;     //其他继承这个原型的对象,也会跟着改变,所以一般不允许直接修改原型链的属性,除非你自认为能够驾驭的了
    
    • 当设置对象属性时,直接设置的是对象的自身属性(对象属性);如果自身属性和原型属性名字冲突了,原型上的属性没影响,只是设置了自身的同样属性,而且原型上的属性不再影响这个对象
    • 如果获取时,
      1.首先查看该对象有没有这个名称的对象属性,如果有直接返回这个属性值
      2.如果没有向下查找紧邻的原型链中的属性是否具有该属性名
      3.查找到距离该对象最近的原型链中属性名后返回其值
  • 相关阅读:
    博客搬迁
    android中listview的item滑动删除效果(已解决listview点击问题)
    来把博客园变成“原谅”的颜色
    Datatables后台服务器端分页、根据条件重新查询、主要技术问题
    JQuery双列表交互模态窗口,列表项互相、上下移动
    Angular页面刷新保存变量数据,运用localstorage
    Angular中使用datatable.js出现错误“ui-router TypeError: Cannot read property 'childNodes' of undefined”的解决方法
    使用swiper-animate.js制作h5宣传页
    使用JavaScript/JQuery 操作SVG元素的几个关键技巧
    mac os系统使用Visual Studio Code打开浏览器查看HTML文件
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13492712.html
Copyright © 2020-2023  润新知