JavaScript面向对象编程核心概念与实战指南
本文系统梳理JavaScript面向对象编程的核心知识,涵盖函数定义与this指向(call、apply、bind)、严格模式、高阶函数与闭包原理及实战场景(如索引获取、定时器、打车计费),深入解析递归函数的定义、栈溢出风险及阶乘与斐波那契数列应用,最后介绍正则表达式基础与ES6新增语法及内置对象拓展,帮助开发者构建完整的JS知识体系。
年后的工作状态大致如此:

浏览社交媒体时,也常能看到引发共鸣的观点:

(此处为内容分隔)
无论如何,生活仍需继续。

节后这段时间,我在享用沙糖桔的同时,逐步重启学习进程,重点聚焦于面向对象编程。
首先展示学习框架图:

函数的定义和使用
该部分主要复习此前jQuery的相关知识,包括函数的定义方式与调用方法(此处不再详述)。
this指向问题
本模块重点学习不同函数中this所指向的对象,以及改变函数内部this指向的方法:call、apply、bind。
改变函数内部this指向的方法还包括:call、apply、bind。
这三种方法的共同点在于:均能改变this的指向;
这三种方法的区别在于:
- call和apply会立即调用函数,并改变函数内部this的指向;
- call和apply在参数传递上存在差异:call使用逗号分隔传递参数,而apply使用数组传递参数;
- bind不会立即调用函数,但可以改变函数内部this的指向。
严格模式
本模块主要学习并了解什么是严格模式。
严格模式的定义:ES5中的严格模式是一种采用限制性JavaScript变体的方式,即在严格的条件下运行JS代码。(严格模式仅在IE10及以上版本的浏览器中得到支持,在旧版本浏览器中会被忽略。)
开启严格模式:
- 为整个脚本开启严格模式;
- 为特定函数开启严格模式。
高阶函数
本模块主要学习高阶函数的定义及其相关应用。
高阶函数的定义:高阶函数是指对其他函数进行操作的函数,它可以接收函数作为参数,或将函数作为返回值输出。
最容易理解的例子是回调函数,它属于高阶函数。
闭包
本模块主要学习闭包的定义、作用及具体运用。
闭包的定义:闭包(closure)指有权访问另一个函数作用域中变量的函数。简单来说,就是一个作用域可以访问另一个函数内部的局部变量。
闭包的作用:延伸了变量的作用范围。
闭包的具体运用场景包括:
点击li元素时打印当前索引号
<body>
<ul class='nav'>
<li>榴莲</li>
<li>臭豆腐</li>
<li>鲱鱼罐头</li>
<li>大猪蹄子</li>
</ul>
</body>
<script>
// 原始获得索引号的方法
var lis = document.querySelector(".nav").querySelectorAll("li");
for (var i = 0; i < lis.length; i++) {
lis[i].index = i;
lis[i].onclick = function() {
console.log(this.index);
}
}
// 闭包的定义:指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
// 需求:利用闭包来得到li的索引号
var lis = document.querySelector(".nav").querySelectorAll("li");
for (var i = 0; i < lis.length; i++) {
(function(i) {
// console.log(i);
lis[i].onclick = function() {
console.log(i); //我们为了点击时才会出现i
}
})(i);
}
</script>3秒后打印li元素内部的内容
<body>
<ul class='nav'>
<li>榴莲</li>
<li>臭豆腐</li>
<li>鲱鱼罐头</li>
<li>大猪蹄子</li>
</ul>
</body>
<script>
// 利用闭包来得到li的索引号
var lis = document.querySelector(".nav").querySelectorAll("li");
for (var i = 0; i < lis.length; i++) {
(function(i) { //这是立即执行函数
// 简单来说就是把定时器放在立即执行函数里面
setTimeout(function() { //在立即执行函数里的任何一个函数都可以调用立即执行函数里的变量
console.log(lis[i].innerHTML);
}, 2000)
})(i);
}
</script>打车价格的计算应用
<!-- 需求:打车起步价13(3公里内), 之后每多一公里增加 5块钱. 用户输入公里数就可以计算打车价格
如果有拥堵情况,总价格多收取10块钱拥堵费 -->
<script>
var car = (function() { //立即执行函数
var start = 13; //起步价
var total = 0; //总价
return {
price: function(n) {
if (n <= 3) {
total = start;
} else {
total = start + (n - 3) * 5;
}
return total;
},
yd: function(flag) {
return flag ? total + 10 : total;
} //拥堵的费用
}
})();
car.price();
console.log(car.price(5));
console.log(car.yd(true));
</script>递归
本模块主要学习递归的定义及其运用。
递归的定义:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己,这个函数就是递归函数。
注意:递归函数的作用与循环效果类似,但由于递归很容易发生“栈溢出”错误(stack overflow),因此必须添加退出条件return。
递归的具体运用场景包括:
求1到n的阶乘
<script>
function fn(n) {
if (n == 1) {
return 1; //判断条件来退出
}
return n * fn(n - 1); //思路:前一项*后一项
// 利用return来调用函数本身
};
// fn(); //递归类似于循环;自己调用自己
console.log(fn(4));
</script>求斐波那契数列
<script>
// 1、1、2、3、5、8、13、21...当用户输入n的值来得到在斐波那契数列中的值
function fb(n) {
if (n === 0 || n === 1 || n === 2) {
return 1;
} else {
return fb(n - 1) + fb(n - 2); //规律:当用户输入n我们得到(n-1)和(n-2)这两项就能计算出n、对应的序列值
}
}
console.log(fb(0));
console.log(fb(4));
</script>递归遍历数据
<script> var data = [{ id: 1, name: '家电', goods: [{ id: 11, gname: '冰箱' }, { id: 12, gname: '洗衣机' }] }, { id: 2, name: '服饰' }]; // 效果:我们想要输入id号就可以返回的数据对象(利用递归来遍历) // 1.利用forEach 去遍历里面的每一个对象 function getID(json, id) { //json就是一整个大的数组 json.forEach(function(item) { //item就是data里面的id if (item.id == id) { console.log(item); // } else if (item.goods && item.goods.length > 0) { // 2.遍历对象里面的对象11 12 可以利用递归函数(调用自己getID(对象里面的对象item.goods,id)) // 里面应该有goods这个数组并且数组的长度不为0 getID(item.goods, id); } }); } getID(data, 1); getID(data, 2); getID(data, 11);</script>正则表达式
本模块主要学习正则表达式的定义及其在JS中的使用(该模块需查阅相关文本以辅助使用)。
学习框架如下:

ES6
本模块主要学习ES6新增语法及ES6内置对象的拓展。
ES6新增语法框架:

ES6内置对象拓展框架:

总结
本文到此结束,希望能为您提供帮助,也欢迎您关注本站的更多内容!
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
相关标签:
