1。JS中的继承说到继承,JavaScript只有一种结构:对象。每个实例对象(object)都有一个私有属性(称为proto)指向其构造函数(prototype)的原型对象。原型对象也有自己的原型对象(__proto__),层层叠叠直到一个对象的原型对象为空。根据定义,null没有原型,充当此原型链中的最后一环。2.继承属性JavaScript对象是动态属性的“包”(指自身的属性)。JavaScript对象有一个指向原型对象的链。当尝试访问对象的属性时,它不仅会在对象上搜索,还会在对象的原型上搜索,然后在对象原型的原型上搜索,依此类推,直到找到具有匹配名称的属性或到达原型链的末端。3.创建原型链的演示//让我们从一个函数创建一个对象o,它本身有属性a和b:letf=function(){this.a=1;this.b=2;}/*这和写functionf()是一样的{this.a=1;this.b=2;}*/leto=newf();//{a:1,b:2}//在函数f中定义原型上的属性f.prototype.b=3;f.prototype.c=4;//不要直接在f函数的原型上定义f.prototype={b:3,c:4};这将直接破坏原型链//o.[[Prototype]]具有属性b和c//(实际上是o.__proto__或o.constructor.prototype)//o.[[Prototype]].[[Prototype]]是Object.prototype。//最后o.[[Prototype]].[[Prototype]].[[Prototype]]为null//这是原型链的结尾,即null,//根据定义,null表示没有[[原型]]。//综上所述,整个原型链如下://{a:1,b:2}--->{b:3,c:4}--->Object.prototype--->nullconsole。日志(o.a);//1//a是o的自属性吗?是的,这个属性的值是1console.log(o.b);//2//b是o的自有属性吗?是的,这个属性的值为2//原型上还有一个'b'属性,但是不会被访问到。//这种情况称为“属性阴影”console.log(o.c);//4//c是o的属性吗?不对,我们看看它的原型上有没有//cisanattributeofo.[[Prototype]]?是的,这个属性的值是4console.log(o.d);//未定义//d是o的自有属性吗?这不,我们看看它的原型上有没有o.[[Prototype]]的//d属性?没有,然后检查是否有//o.[[Prototype]].[[Prototype]]为null,停止搜索//找不到d属性,返回undefined
