内容:1、问题描述2、Prototype3、__proto__4、getPrototypeOf()1、问题描述在写代码的时候遇到了以下问题:functionUser(){this.name='xw'this.age=10}User.prototype.getName=()=>{console.log(this.name);}letu=newUser()console.log(Object.getPrototypeOf(u));console.log(User.prototype);console.log(u.__proto__);//{getName:[Function(anonymous)]}//{getName:[Function(anonymous)]}//{getName:[Function(anonymous)]}我用构造函数User创建了一个实例u,然后通过三个方法可以得到构造函数的原型:Object.getPrototypeOf、prototype、__proto__,那么这几个有什么本质区别三种方法?先测试获取到的三个方法是否是同一个原型对象:console.log(Object.getPrototypeOf(u)===User.prototype);console.log(Object.getPrototypeOf(u)===u.__proto__);console.log(u.__proto__===User.prototype);//true//true//true显然是的,那我们分析一下本质这三种实现原型采集的方法,以及它们的区别。2、关于prototype的本质:每个构造函数都会默认创建一个prototype对象,用来存放对象实例共享的变量和方法。所以可以理解为User.prototype是构造函数的原型,用来让构造函数找到自己的原型,也可以通过prototype手动改变构造函数的原型。3.__proto__本质:是用户获取对象实例原型的非标准方法。可以抓住核心,所谓非标准,就是不被Web标准认可的方法,迟早会被取代,所以不推荐使用。从MDN的介绍也可以看出,这种方式随时可能被抛弃,所以尽量不要使用。4、getPrototypeOf()的本质:是ES5提供的获取对象原型的标准方法。在MDN中是这样定义的:关键点是指定的对象,如果不是对象就会报错。另外,getPrototypeOf()和prototype://Object在JavaScript中也是一个构造器(创建对象的包装器)。//一般用法是:varobj=newObject();//所以:Object.getPrototypeOf(Object);//?(){[本地代码]}Object.getPrototypeOf(Function);//?(){[本机代码]}Object.getPrototypeOf(Object)===Function.prototype;//true//Object.getPrototypeOf(Object)把Object构造函数当做一个对象,//当然返回的是函数对象的原型,即Function.prototype。//正确的做法是Object.prototype是构造对象的原型。varobj=newObject();Object.prototype===Object.getPrototypeOf(obj);//trueObject.prototype===Object.getPrototypeOf({});//true总结:一般不要使用prototype来获取原型对象,除非你想改变构造函数的原型对象;获取对象实例的原型对象,首选Object.getPrototypeOf();如果E5不支持,考虑使用__proto__获取对象实例的原型;
