zoukankan      html  css  js  c++  java
  • 对象进阶原型和原型链之基础认知

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

    看了很多关于原型和原型链的讲解,基本都是用代码解释,但是对于新手来说,我觉得直接用白话文来解释或许更加的合适。
    原型链: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.查找到距离该对象最近的原型链中属性名后返回其值
  • 相关阅读:
    笔记本电脑处理器(CPU)性能排行榜
    SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法
    Installshield使用教程
    区间DP--凸多边形三角剖分
    树形DP--codevs 1380 没有上司的舞会
    DP练习 巡逻
    DP练习 最长上升子序列nlogn解法
    线段树 求区间连乘——hdu 3074 Multiply game
    模拟算法+栈 HDU 1022
    并查集--CSUOJ 1601 War
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13492712.html
Copyright © 2011-2022 走看看