第一模块:
课程名称:直面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第四模块:

随时随地看视频