普通函数和构造函数还是之前的函数,唯一不同的是首字母大写//ConstructorfunctionFoo(m,n){letret=m+n;这个.m=m;这个.n=n;returnret;}//普通函数functionfoo(m,n){letret=m+n;这个.m=m;这个.n=n;还是按照栈执行+作用域链查找机制//普通函数调用letret=Foo(10,20);控制台日志(ret);当用new关键字调用构造函数执行new操作时,浏览器会创建一个空格,表示空对象关联this,this指向新创建的实例。如果函数体中没有return或者return是基本数据类型,则默认返回对象实例;如果在函数体中返回了引用类型,那么它作为main函数返回了自己,此时称为类,返回结果称为对象实例//构造函数执行letres=newFoo(20,20);控制台日志(资源);new操作符一般使用new来完成对象实例的创建,如果当前类不需要传递参数的话,可以不带括号的运行newFoo。没有括号,表示FOO不需要传递参数,称为无参列表。newFoo和newFoo()的优先级不同,前者是19,后者是20每次new都会重新执行函数,生成新的执行上下文,创建新的实例对象,所以这两个实例对象不同。重写新方法new的作用。创建实例对象并执行构造函数,将this指向实例对象处理返回值模拟new实现functionPerson(name){this.name=name;}Person.prototype.slogan=function(){console.log("The前端界最帅的人");};Person.prototype.sayName=function(){console.log(`Mynameis${this.name}`);};//letp1=newPerson('zce')//p1.slogan()//p1.sayName()function_new(Ctor,...params){//01创建实例对象//letobj={}//obj.__proto__=Ctor.prototypeletobj=Object.create(Ctor.prototype);//02调用构造函数,把this改成指向letret=Ctor.call(obj,...params);//03处理返回结果if(ret!==null&&/^(object|function)$/.test(typeofret)){returnret;}returnobj;}letp1=_new(Person,"zce");p1.slogan();p1.sayName();console.log(p1instanceofPerson);prototype和原型链名词描述原型属性每个函数(除了箭头函数)数据类型有一个原型属性,指向原型对象(函数除外)。每个原型对象都有一个构造函数属性,它指向当前构造函数本身的函数数据类型。普通函数、箭头函数、生成器函数构造函数(自定义类)内置函数(内置构造函数)proto属性每个对象数据类型都有自己的proto属性,(隐式原型)这个属性的值指向它所指向的类它属于普通对象、数组对象、常规对象、日期对象的原型对象原型对象数据类型,原型对象实例对象函数也是一个对象对象类所有对象都是内置类的对象实例对象也是一个函数,还有一个prototype属性,指向自己的一个prototype对象的prototype也是一个对象,所以它有proto属性Object。原型对象的proto指向Null(内部设计)。原型链搜索机制首先找到自己的私有属性。找到所属类的原型对象如果没有类的原型,则根据原型对象的proto继续向上查找,直到找到Object.prototype示例代码functionFoo(){this.m=10;这个.n=24;this.getM=function(){console.log(this.m);};}Foo.prototype.getM=function(){console.log(this.m);};Foo.prototype.getN=function(){console.log(this.n);};letfoo1=newFoo();letfoo2=newFoo();console.log(foo1.getM===foo2.getM);控制台日志(foo1.getN===foo2.getN);console.log(foo1.__proto__.getN===Foo.prototype.getN);console.log(foo1.__proto__.getM===foo2.getM);console.log(foo1.getM===Foo.prototype.getM);console.log(foo1.constructor);console.log(Foo.prototype.__proto__.constructor);foo1.getM();foo1.__proto__。getM();foo2.getN();Foo.prototype.getN();FunctionandObjectfunctions多角色函数普通函数调用(栈执行作用域)构造函数实例化(原型和原型链)对象键值对三没有角色之间必然联系,但核心功能是功能。函数是一等公民。JS中有很多角色。每个对象都有一个proto属性,指向它所属的类。原型对象(隐式原型,原型链属性)每个函数都有一个原型属性,所有指向其原型对象的函数都是内置类Function的实例,而Function本身也是一个函数。所有的对象都是Object的实例,而Object也是一个函数。Function和Object是两个并行的基类。虽然最终的搜索点是Object,但是Function.prototype原型对象是匿名函数,虽然是函数,但其处理机制与原型对象相同。它的proto属性指向它所属类的原型对象,即Object.prototype没有原型属性Function.prototype没有。是一个使用ES6语法定义函数的匿名函数对象constobj={say(){}}箭头函数没有prototype属性的函数不能执行new操作
