「写在前面」
本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容:
1. JavaScript 学习笔记(Day1)
2. JavaScript 学习笔记(Day2)
3. JavaScript 学习笔记(Day3)
4. JavaScript 学习笔记(Day4)
5. JavaScript 学习笔记(Day5)
6. JavaScript 学习笔记(WEB APIs Day1)
7. JavaScript 学习笔记(WEB APIs Day2)
8. JavaScript 学习笔记(WEB APIs Day3)
9. JavaScript 学习笔记(WEB APIs Day4)
10. JavaScript 学习笔记(WEB APIs Day5)
11. JavaScript 学习笔记(WEB APIs Day6)
12. JavaScript 学习笔记(JS进阶 Day1)
13. JavaScript 学习笔记(JS进阶 Day2)
P177:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=177
P178:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=178
总结:
function Star(uname, age){
this.uname = uname
this.age = age
this.sing = function () {
console.log('我会唱歌')
}
}
// 实例对像,获得了构造函数中封装的所有逻辑
const ldh = new Star('刘德华', 18)
const zxy = new Star('张学友', 19)
console.log(ldh.sing === zxy.sing) // 结果是 false 说明俩函数不一样
P179:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=179
function Star(uname, age) {
this.uname = uname
this.age = age
}
console.log(Star.prototype)// 返回一个对象称为原型对象
Star.prototype.sing = function () {
console.log('我会唱歌')
}
const ldh = new Star('刘德华', 18)
const zxy = new Star('张学友', 19)
console.log(ldh.sing === zxy.sing) // 结果是 true 说明俩函数一样,共享
构造函数和原型对象中的this 都指向实例化的对象
// 构造函数
let that
function Person (name) {
this.name = name
that = this
}
const o = new Person()
console.log(that === o) //true
// 原型对象
let that
function Person(name){
this.name = name
}
Person. prototype.sing = function () {
that = this
}
const o = new Person()
o.sing()
console.log(that === o) // true
案例:给数组扩展方法
P180:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=180
P181:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=181
在哪里? 每个原型对象里面都有个constructor 属性(constructor 构造函数)
作用:该属性指向该原型对象的构造函数, 简单理解,就是指向我的爸爸,我是有爸爸的孩子
使用场景:如果有多个对象的方法,我们可以给原型对象采取对象形式赋值。但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor 就不再指向当前构造函数了。此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。
function Star(name){
this.name = name
}
star. prototype = {
sing: function () { console.log('唱歌') },
dance: function () { console.log('跳舞') }
}
console.log(Star.prototype.constructor) // 指向 Object
function Star( name) {
this.name = name
}
Star.prototype = {
// 手动利用 constructor 指回 Star 构造函数
constructor: Star,
sing: function () { console.log('唱歌') },
dance: function() { console.log('跳舞') }
}
console.log(Star.prototype.constructor) // 指向 Star
P182:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=182
对象都会有一个属性 __proto__ 指向构造函数的 prototype 原型对象,之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 __proto__ 原型的存在。
注意:
P183:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=183
继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,JavaScript 中大多是借助原型对象实现继承的特性。
例如现在有Man和Woman两个对象:
1. 封装-抽取公共部分
把男人和女人公共的部分抽取出来放到人类里面
// 人类
const People = {
head: 1,
eyes: 2,
legs: 2,
say: function () { },
eat: function () { }
}
// 男人
function Man() {
}
// 女人
function Woman() {
this.baby = function () { }
}
2. 继承-让男人和女人都能继承人类的一些属性和方法
// 人类公共的属性和方法
const People = {
head: 1,
eyes: 2,
legs: 2,
say: function () { },
eat: function () { }
}
// 男人
function Man() {
}
// 把公共的属性和方法给原型,这样就可以共享了
Man.prototype = People
// 注意让原型里面的constructor重新指回Man找自己的爸爸
Man.prototype.constructor = Man
const pink = new Man()
console.log(pink)
3. 问题: 如果我们给男人添加了一个吸烟的方法,发现女人自动也添加这个方法
原因:
男人和女人都同时使用了同一个对象,根据引用类型的特点,他们指向同一个对象,修改一个就会都影响
4. 解决:
构造函数
new 每次都会创建一个新的对象
function Star() {
this.age = 18
this.say = function () { }
}
const ldh = new Star()
const zxy = new Star()
console.log(ldh)
console.log(zxy)
console.log(ldh === zxy) // false 每个实例对象都不一样
P184:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=184
基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链
原型链-查找规则:
模态框封装:
P185:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=185
open方法封装:
P186:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=186
colse方法封装
P187:https://www.bilibili.com/video/BV1Y84y1L7Nn?p=187
本文由 mdnice 多平台发布