面试,深入学习:js原型和原型链具体是什么?梳理一下这些内容1.首先介绍一下什么是对象,在不同的语言中是如何定义对象的:比如在典型的面向对象编程语言(如C++和Java)中,有“类”(类)概念。所谓“类”就是对象的模板,对象就是“类”的实例。但是,JavaScript语言的对象系统并不是基于“类”,而是基于构造函数和原型链。(注意:理解这一点很重要)2.引入js构造函数。JavaScript语言使用构造函数(constructor)作为对象模板。所谓“构造函数”,就是专门用来生成实例对象的函数。它是对象的模板,描述了实例对象的基本结构。构造函数可以生成多个实例对象,所有实例对象都具有相同的结构。构造函数是一个普通的函数,但它有自己的特点和用法。例如://下面的代码可以在浏览器中正常运行letHuman=function(){this.name="name";这个年龄=21;};或者写#functionHuman(name,age){//可以通过传入参数来初始化值#this.name=name;#this.age=年龄;#}//我们实例化函数lethuman=newHuman();//打印出实例对象(human)console.log(human);//{name:"name",age:21}从打印结果来看,human是一个对象注:为了区别于普通函数,构造函数名的首字母通常大写Constructor有两个特点。函数体内使用this关键字,this指向要生成的对象实例(如例子中的human)。生成对象时,必须使用new命令。解释this.name在构造函数中的含义。this.name表示实例对象(human)中有一个属性名。//看看ECMAScript官网是怎么描述创建和初始化对象的构造函数对象的//创建和初始化对象的函数对象(描述构造函数的作用)NOTEThevalueofaconstructor's"prototype”属性是一个原型对象,用于实现继承和共享属性。//构造函数的“prototype”属性的值是用于实现继承和共享属性的原型对象。(说明构造函数中的属性原型其实是一个对象)3、介绍一下什么是js原型。先明确两个概念:js分为函数对象和普通对象,每个对象都有一个__proto__属性。但只有函数对象具有原型属性。Object和Function是js的内置函数。同样,我们经常使用Array、RegExp、Date、Boolean、Number、String__proto__和prototype。什么是属性__proto__是一个对象,它有两个属性,constructor和__proto__;原型对象prototype有一个默认的constructor属性,用来记录哪个构造函数创建了实例;看下面的代码functionPerson(name,age){this.name=name;这个。年龄=年龄;}Person.prototype.conmonPropert='内容值';//实例化letperson1=newPerson("张三",21);letperson2=newPerson("李四",22);//打印person1,person2console.log(person1);//见图1console.log(person2);//看图2Figure1Figure2下面我详细解释一下,由于原型链的关系,person1和person2都可以访问属性conmonPropert。试想一下,如果Person的构造函数代表一个人,它会不会有更多的属性,比如头发、皮肤、身高等等,这些属性是每个人共有的共同属性。属性或方法越多,原型和原型链的意义就体现出来了。再来说说原型链。这个比较简单。每个对象都会隐式引用__proto__对象,每个__proto__对象都有两个属性:constructor和__proto__。逐层嵌套__proto__直到__proto__属性为空。就像这种关系,正是这种关系形成了原型链__proto____proto____proto__四、总结与Q&A1、原型有什么用?原型对象的作用是存放共享的属性和方法,可以大大减少内存消耗。2、什么是原型链?在js中,每个对象都隐式引用了__proto__对象,每个—__proto__对象都包含了__proto__对象。这种关系是一层一层嵌套的,形成一个原型链,直到__proto__为空。//整理相关知识js之父在设计js原型和原型链时遵循以下两条准则1.Person.prototype.constructor==Person//**条件1:原型对象的构造函数(即Person.prototype)指向构造函数本身**//以person1为例2.person1.__proto__==Person.prototype//**准则2:实例对象(即person1)的__proto__和prototype对象指向同一个地方**//注解(原型本质上也是一个对象)
