ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
-------------------------------------------------------------------------------------------------------------------------------------------------------- <div id="div7"><h3><font color=red> 6,什么是原型,什么是原型链,两者关系 </font> <h3></div> 1\. 原型对象也是普通的对象,是对象一个自带隐式的 \_\_proto\_\_ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2\. 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链 - 原型(prototype):函数自带的属性,函数的实例化对象找不到某个属性或者方法,一定会去构造函数的原型下去找 - 原型链(__proto__):实例化对象身上自带一个属性 - 原型关系链:函数的实例化对象找不到某个属性或方法,一定会去构造函数的原型下去找,如果还没有会去原型下的原型链查找,直到找到Object.prototype为止 - 两者关系:实例化对象的原型链 === 构造函数的原型 ```javascript //接下来说一下原型链 //首先明确的是函数有prototype //对象有_proto_ //万物皆对象所以其实函数也有_proto_属性 例子: function fn(){ this.a=1; } var newfn=new fn(); newfn._proto_=>fn.prototype=>_proto_=>Object.prototype=>_proto_=>null // 原型链最顶层是Null constructor=>最终指向函数本身 ``` -------------------------------------------------------------------------------------------------------------------------------------------------------- <div id="div1"><h3> <font color=red> 1,构造函数、实例、原型三者之间的关系 </font><h3></div> ```javascript // 构造函数 function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } Person.prototype.nationality = "English"; //添加新的属性 this.nationality = "English"; Person.prototype.name = function() { // 使用 prototype 属性给添加新的方法 return this.firstName + " " + this.lastName; }; ``` 1,构造函数(constructor):专门用来生成实例对象的函数,实例的构造函数属性(constructor)指向构造函数, 2,原型对象(prototype):就是定义所有实例对象共享的属性和方法的对象 3,prototype是构造函数访问原型对象,\__proto\__是对象实例访问原型对象。 4,通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针\__proto\__ - 1,每个对象都有 \__proto__ 属性,但只有函数对象才有 prototype 属性, ```javascript let obj = {} obj.__proto__ === Object.prototype // true ``` - 2, 函数都同时拥有__proto__和protytpe属性, 函数的__proto__指向自己的函数实现, 函数的protytpe是一个对象, 所以函数的prototype也有__proto__属性 指向Object.prototype ```javascript function func() {} func.prototype.__proto__ === Object.prototype // true ``` - 3,Object.prototype.__proto__指向null,对象到原型,再到原型的原型……所有对象的原型最终都可以上溯到Object.prototype ```javascript Object.prototype.__proto__ // null ```