第一模块:
课程名称:直面JavaScript中的30个疑难杂症
章节:8-2~8-3
讲师名称:公明2020
第二模块:
什么是原型?
任何对象都有一个原型对象,这个原型对象由对象的内置属性_proto_指向它的构造函数的prototype指向的对象,即任何对象都是由一个构造函数创建的,但是不是每一个对象都有prototype,只有方法才有prototype。
什么是原型链?
原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了。
总结:
所有的引用类型(数组、函数、对象)可以自由扩展属性(除null以外)。
所有的引用类型都有一个’_ _ proto_ _'属性(也叫隐式原型,它是一个普通的对象)。
所有的函数都有一个’prototype’属性(这也叫显式原型,它也是一个普通的对象)。
所有引用类型,它的’_ _ proto_ _'属性指向它的构造函数的’prototype’属性。
当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它的’_ _ proto_ _'属性(也就是它的构造函数的’prototype’属性)中去寻找。
第三模块:
// 原型举例 function Student(name){ this.name=name; } Student.prototype.sex='男'; let stu=new Student('小李'); let stu1=new Student('小张'); let stu2=new Student('小王'); console.log(stu.sex) //男 console.log(stu1.sex) //男 console.log(stu2.sex) //男 // 注意:通过构造函数创建出来的对象,都可以使用该构造函数的原型上的属性和方法, 但是,如果对象本身有该属性或者方法,则优先使用自己身上的,以下代码在stu1上修改sex属性 stu1.sex='女'; console.log(stu.sex) //男 console.log(stu1.sex) //女 console.log(stu2.sex) //男 // stu1手动修改了Sex属性为女,它读取的时候,就是优先从自身读,自身没有,再去原型上查找。 // 补充一个特殊属性 constructor 构造器 constructor是原型prototype的隐式属性,指向的是构造函数本身,一个对象若是想知道自己是被谁创建出来的,就通过这个属性查询。 stu1.constructor ===> function Student|Student.prototype.constructor ===> function Student // 原型链举例 function Grand(){ Grand.prototype={ xing:'王', } } let grand=new Grand(); function Father(){}; Father.prototype=grand; let father=new Father functionSon(){} Son.prototype=father; let child=new Son(); console.log(child.xing); //xing //创建了一个child对象,他是Son()的实例对象,Son构造函数的原型呢指向的是father。 father是通过new Father构造函数创建的,father的原型自然指向的就是Father.prototype。 Father.prototype被我们修改为grand,grand是Grand的实例对象,他的原型就是Grand.prototype
第四模块: