面向对象
对象是什么? 为什么要面向对象?
特点:面向对象——逻辑迁移更加灵活、代码复用性高、高度的模块化
对象的理解——并不是指传统js中的object对象
- 对象是对于单个物体的简单抽象
- 对象是一个容器,封装了属性 & 方法
let obj = {
name:'yy',
coures:'oop'
}
// thinking1
obj = {
name:'xm'
}
obj.name = 'jcss'
// thinking2
obj1 = {
name:'xm'
}
obj2 = {
name:'jcss
}
obj3 = {
name:'teacher'
}
// 简单对象
const course = {
teacher:'yy',
course:'oop',
startCourse:function(){
// 开始课程
}
}
// 函数对象
function Course(){
this.teacher='yy'
this.course='oop'
this.startCourse = function() {}
}
构造函数
需要一个模版 - 表征了一类物体的共同特征,从而生成对象
类即对象模版
function Cuorse(teacher){
this.teacher=teacher
this.course='oop'
this.startCourse = function() {}
}
const course = new Course('yy')
const course1 = new Cuorse('zz')
Course 本质就是构造函数
面试题:
- 1、函数体内使用的this,指向所要生成的实例
- 2、生成对象使用new来进行实例化
- 3、可以做初始化传参
追问:
如果构造函数不初始化,可以使用吗?— 无法正确使用(内部this指向window)
如果项目中需要使用,通常(不被外界感知)如何解决?
let staticProps = undefined
function Course() {
const _isClass = this instanceof Course
if(!_isClass) {
staticProps = new Course()
return staticProps
} else {
return staticProps
}
this.teacher = 'yy'
this.course = 'oop'
this.startCourse = function() {}
}
// 使用方
const course = Course()
// 暴露出去的是实例,而将实例化的过程放置在下层不背上层所感知
* 启发:如果写底层代码时,不需要让外界熟悉感知内部代码思想
* 延伸:通过改进 => 不多次实例化,同一个实例 => 单例模式
思考:new是什么? / new的原理 / new的时候做了些什么?
function Course (teacher, course) {
this.teacher = teacher
this.course = course
}
const course1 = new Course('yy', 'oop')
const course2 = new Course('zz', 'js')
- 1、结构上:创建了一个空对象,作为返回的对象实例
- 2、属性上:将生成的空对象和类产生了关联 => prototype
- 2.5、属性上:将生成的对象的原型对象指向了构造函数的prototype属性
- 3、关系上:将当前实例对象赋给了内部this
- 4、声明上:构造函数初始化代码的执行