手记

【金秋打卡】第九天 原型和原型链

第一模块:

课程名称:直面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


第四模块:



0人推荐
随时随地看视频
慕课网APP