什么是目录对象?构造函数原型对象实现继承和不同的继承方式为什么对象需要面向对象编程?代码逻辑迁移更灵活,代码复用性高,高度模块化的构造函数Person(name){this.name=namethis.getName=function(name){returnname}}constperson=newPerson()函数体内this指向生成的实例对象生成的对象可以用new关键字实例化在初始化新实例的过程中创建一个空对象,将生成的空对象的原型对象指向构造函数的prototype属性作为返回对象实例。将当前实例对象赋值给内部this并执行构造函数初始化代码Fn.prototype)constobj=Object.create(Fn.prototype)//将当前实例对象赋值给内部`this`,并执行构造函数初始化代码constresult=Fn.apply(obj,params)返回(结果&&(类型结果==='对象'||类型结果==='函数'))?result:obj}如何创建一个没有消息实例化(不被外界感知)的构造函数functionPerson(){//判断是否是一个新的实例对象if(!thisinstanceofPerson){returnnewPerson()}this.名字=“汤姆”;this.getName=function(){returnthis.name}}constperson=Person();使用构造函数的缺点构造函数中的方法会存在于每一个生成的实例对象中,重复挂载实际上会导致资源浪费Fee因此使用原型对象来解决上述问题。原型对象每个函数都有一个属性——原型。这个原型的属性值是一个对象(属性的集合)。默认情况下,只有一个名为constructor的属性,它指向函数本身。如下图所示:上图中,SuperType是一个函数,右边的框是它的原型。由于原型是一个对象(属性的集合),所以除了构造函数之外,还可以自定义很多属性,比如:functionPerson(name){this.name=name;}//给属性赋值原型对象作为实例对象继承属性避免重复挂载方法Person.prototype.getName=function(){returnthis.name}“隐式原型”proto每个对象都有一个__proto__属性,指向创建该对象的构造函数原型。注意:Object.prototype确实是一个特例——它的__proto__指向null,切记切记!!!从上图可以看出:自定义函数Foo.__proto__指向Function.prototype,Object.__proto__指向Function.prototype。但是为什么Function.__proto__指向Function.prototype呢?其实道理很简单:Function也是函数,函数是一种对象,也有__proto__属性。既然是函数,那肯定是Function创建的。所以Function是自己创建的。所以它的__proto__指向它自己的Prototype。最后一个问题:Function.prototype指向的对象,它的__proto__是否也指向Object.prototype?答案是肯定的。因为Function.prototype指向的对象也是Object创建的普通对象,所以也遵循基本规则。继承原型链inheritfunctionPerson(){}Person.prototype.getName=function(){returnthis.name}functionMan(){}Man.prototype=newPerson();Man.prototype.constructor=Man本质:re在原型对象方法中,将父对象的属性和方法作为子对象原型对象的属性和方法。缺点:一旦将父类的属性赋值给子类的原型属性,属性属于子类的共享属性且子类被实例化,不能向父类的构造函数传递参数继承函数Person(){}Person.prototype.getName=function(){returnthis.name}functionMan(arg){Person.call(this,arg)}//解决方法共享属性的问题+child传参给parent的问题组合继承functionPerson(){}Person.prototype.getName=function(){returnthis.name}functionMan(arg){Person.call(this,arg)}Man.prototype=newPerson();man.prototype.constructor=Man缺点:无论什么场景,都会调用两次父构造函数来初始化子类原型。子类调用函数内部调用父类时,寄生组合继承functionPerson(){}Person.prototype.getName=function(){returnthis.name}functionMan(arg){Person.call(this,arg)}Man.prototype=Object.create(Person.prototype);Man.prototype。constructor=Man如何实现多重继承函数Person(name){this.name=name}Person.prototype.getName=fufunction(){returnthis.name}functionWorker(salary){this.salary=salary}Worker.prototype.getSalary=function(){returnthis.salary}functionMan(arg){Person.call(this,arg)}Worker.call(this,arg)}Man.prototype=Object.create(Person.prototype);Object.assign(Man.prototype,Worker.prototype);Man.prototype.constructor=Man参考文章新建实例化对象过程【JS】深入理解JS原型与继承
