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

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

看了很多关于原型和原型链的讲解,基本都是用代码解释,但是对于新手来说,我觉得直接用白话文来解释或许更加的合适。
原型链: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.查找到距离该对象最近的原型链中属性名后返回其值
原文地址:https://www.cnblogs.com/94-Lucky/p/13492712.html