第十九天笔记

原型和继承

函数的原型(prototype)

概述

prototype 是函数内的一个对象空间,每个函数都有一个,他被称为显式原型

对应的构造函数也属于函数 那么他同样也拥有一个prototype,且对应的prototype只有一个也就是说他会在预编译时候声明一次,也就是prototype是对应的一个构造函数的公共空间,且他只声明一次那么也就是说他就可以解决对应的构造函数的缺陷

function Person(){
this.name='jack'
}
// 构造函数的prototype空间
console.log(Person.prototype)

从上可以知道prototype这个空间是个对象,可以在这个对象中存入对应的函数

function Person(){
this.name='jack'
}
// 构造函数的prototype空间
console.log(Person.prototype)
// 那么我们就可以将对应的函数存入这个对象空间
Person.prottype.sayHello=function(){
   console.log('hello')
}

总结

每个函数内都存在一个prototype的对象空间 构造函数也是函数所以他也存在

prototype这个空间会在预编译的时候进行开辟 (只开辟一次)

利用prototype可以解决构造函数内存储的函数开辟多个内存空间的问题

所以建议将对应的属性存入对应的构造函数 将对应的方法存入prototype

prototyppe里面的方法 可以直接通过对应的对象.方法名来访问

对象的原型(__ proto __)

__ proto __是对象的一个对象空间,他指向对应的构造函数的prototype,他被称为隐式原型

console.log({}.__proto__)
console.log({}.__proto__ == Object.prototype)
console.log(new Object().__proto__ == Object.prototype)

_ proto _ 指向对应的构造函数的prototype 那么也就意味着如果往对象的_ proto _里面添加内容,其实就往造函数的prototype 中添加。

__ proto __是所有对象都拥有的一个对象空间,他指向对应的构造函数的prototype

原型链

概述

在_proto__中寻找属性的过程形成的链子 被称为原型链

原型链查找过程

image-20230303112806786

总结

  • 对应的函数的_proto指向对应的Funtion的构造函数的prototyper

  • 对应的指向关系 先指向自身的构造函数的prototype 再指向对应的父类的构造函数的prototype 再指向上级父类 直到找到 object的构造函数的prototype Object的构造函数的prototype的_proto__指向null (查找属性找到null还没有返回undefined)

  • 对象赋值不遵从原型链(如果存在就修改,没有就添加)

构造函数的继承

原型链继承

将对应的父类构造放入到对应的子类构造的原型上

缺点: 不能进行初始化赋值操作 覆盖子类原型 子类原型方法只能放在原型继承之后

    function Person(name,age){
       this.name=name
       this.age=age
  }
   Person.prototype.sayHello=function(){
       console.log('hello')
  }
   Person.run=function(){
       console.log('running')
  }
   function Student(classNumber){
       this.class=classNumber
  }
   // 原型链继承 默认继承的元素的属性值显示为undefined
   // 不能进行初始化赋值操作
   // 覆盖子类原型 子类原型方法只能放在原型继承之后
   Student.Perototype = new Person()
   // Student.Perototype.play=function(){console.log('玩')}
   var student=new Student('3年2班')
   console.log(student)
   student.sayHello()
   // 构造函数继承无法继承对应的静态方法
   Student.run()

对象冒充继承

将对应的父类构造函数 当作普通函数执行 传入对应的子类构造中的this


function Student(classNumber,name,age){
Person.call(this,name,age)
this.class = className
}

缺点: 获取不了原型上的方法

组合继承

上两种相加

Student.Perototype = new Person()
function Student(classNumber,name,age){
Person.call(this,name,age)
this.class = className
}

缺点: 原型链上有重复的属性

实例继承(pass)

在子类构造中声明父类对象 自动返回对应的父类对象

寄生继承

Student.Perototype = Object.create(Preson.prototype)
function Student(classNumber,name,age){
Person.call(this,name,age)
this.class = className
}
 
 
posted @   ·阿皓  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示