原型和原型链到底是个啥?是个啥!

290 阅读1分钟

es6中类是咋写的

class Box{
    static b=2;
    a=1;
    constructor(_a){
        this.a=_a
    }
    play(){
        
    }
    static run(){
        
    }
}

es5里类是咋写的

  • function Box(){}相当于es6中class Box{constructor(){}},既是构造函数又是类名。
  • 类是个抽象的概念,它的抽象性描述全部被放在原型上,即prototype上。
  • 任何函数都有一个prototype属性,而且只有函数有,对象没有这玩意。完了的话,只要给构造函数设置prototype属性,就是给该类设置属性。
function Box(_a){
    //对应es6中实例属性
    this.a=_a;
}
//对应es6中静态属性和静态方法
Box.b=2;
Box.run=function(){}

//a被建立在box类原型下
Box.prototype.a=1;
Box.prototype.play=function(){}

var b = new Box(10);

原型和原型链到底有点啥关系

  • 来直接点的
    console.log(b.__proto__===Box.prototype);
    //……结果是true,结束!就酱关系~
    
  • Box类的原型就是该类实例化对象b的原型链。
  • 我们设置在原型上的属性和方法,通过该类实例化的对象都有这些属性和方法。
  • 原型链仅针对对象来说;原型是针对类。
  • 只有es5中有原型的概念,es6中就没有啦,用继承。

要这原型干点啥

  • 可以在类的原型上创造各种方法,但是注意别重名了,别给人原来就有的方法覆盖了!
  • 首先要知道一点就是es5类的原型中this是指实例化的对象!
    Array.prototype.forEach_1=function(fn){
        //这里this指的是arr
        for(var i=0;i<this.length;i++){
            fn(this[i],i,this)
        }
    }
    var arr=[1,2,3,4];
    arr.forEach_1(function(item,index,arr){
        console.log(item,index,arr);
    });