原型和继承
函数的原型(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__中寻找属性的过程形成的链子 被称为原型链
原型链查找过程
总结
-
对应的函数的_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)标签:__,第十九,笔记,Person,原型,prototype,对应,构造函数 From: https://www.cnblogs.com/balloontrue/p/17176856.html
function Student(classNumber,name,age){
Person.call(this,name,age)
this.class = className
}