JS面向对象,设计模式基础

定时器

设置定时器的时候:第一个是回调函数CB、第二个是等待时间、第三个及以后都是到时间后,执行CB,给CB预先传递的实参值。

javascript 复制代码
setTimeout(function(x,y){
    console.log(x,y);//1秒后执行回调函数,x='zhufeng' y='peixun'
},1000,'zhufeng','peixun')

单例设计模式

对象:把描述同一事物的属性和方法放在一起,实现了分组的效果,避免了全局变量污染;每一个对象都是一个单独的实例(个体/堆内存空间),所以我们把这种方案称之为"单例设计模式"

csharp 复制代码
//  person1:命名空间 namespace
var person1 = {
    name:'1',
    age:18,
}
ini 复制代码
// 高级"单例设计模式"
// 资讯板块
var newsModule = (function () {
    var box = null;
    var query = function query() {};

    // 需求:把这个私有的方法setVal,在其它板块中使用
    var setVal = function setVal() {};

    // 解决1:直接挂载到GO中「弊端:挂载的东西多了,很可能有引发全局变量污染」
    window.setVal = setVal;

    // 解决2:基于返回值,返回一个对象(命名空间),里面包含需要供外部调用的属性和方法即可
    return {
        setVal: setVal,
        query: query
    };
})();

// 换肤板块
var skinModule = (function () {
    var box = null;
    var query = function query() {};
    setVal();

    return {};
})();

// 搜索板块
var searchModule = (function () {
    var query = function query() {};
    newsModule.setVal();

    return {};
})();

THIS

全局的THIS是window对象(GO);块级私有上下文中没有自己的THIS,遇到的THIS是宿主环境中的;所以我们研究的THIS都是指函数执行,产生的私有上下文中的THIS。

arduino 复制代码
console.log(this);//window

THIS:函数的执行主体"谁把它执行的",和函数在哪创建以及在哪执行都没有关系!!以后遇到THIS,想起周老师的一句话:"你以为你以为的就是你以为的":冷静、冷静、冷静。按照总结的规律去套即可。

规律

  • 给当前元素的某一个事件行为绑定方法,当事件行为触发,浏览器帮我们把绑定的方法执行,此时方法中的this是当前操作的元素本身;
  • 函数执行,看函数前面是否有"点"
    • 没有:非严格模式下this=>window;严格模式下("use strict")this=>undefined;
    • 有:"点"前面是谁,this就是谁。
ini 复制代码
const fn = function fn() {
console.log(this);
};
let obj = {
    name: 'OBJ',
    // fn: fn   ES6语法中,如果属性名和属性值的变量名字相同,我们可以像以下这样简写
    fn
};
fn();//this ==> undefined
document.body.onclick = fn;//this==>body
obj.fn();//this ==> obj
document.body.onclick = function () {
    // this ==> body
    fn();//this ==> undefined
};
  • 对于普通回调函数"匿名函数"来说,一般方法中的this都是window,除非在触发回调函数执行的时候,我们自己(或者浏览器)做过一些特殊的处理,更改过其this...
ini 复制代码
let obj = {
    name:'zhufeng',
    // 等价于"fn: function () {}",ES6新语法规范
    fn() {
        //this => obj
        /* let self = this;
        setTimeout(function () {
            // this => window  对于普通回调函数"匿名函数"来说,一般方法中的this都是window,除非在触发回调函数执行的时候,我们自己(或者浏览器)做过一些特殊的处理,更改过其this...
            console.log(this.name);

            console.log(self.name);//获取obj.name
        },1000) */

        setTimeout(() =>{
            console.log(this.name);
        },1000)
    }
}
obj.fn();
好用但不要乱用
  • 箭头函数没有this,函数中出现的this是其上级上下文中的this
  • 构造函数中的this是构造函数执行时创建的实例对象。
  • call方法能改变this指向

箭头函数 ArrowFunction

ini 复制代码
const sum = (x, y) => {
    return x + y;
};
// 如果函数体中只有一句话,而且是return啥啥啥的,则可以省略大括号和return
const sum1 = (x, y) => x + y;

// 如果只有一个形参,可以省略小括号
const sum2 = x => x + 10;

箭头函数和普通函数的区别

  • 箭头函数中没有arguments,但是可以使用ES6中的剩余运算符来获取实参集合
    • arguments获取的是类数组集合,不能直接使用数组的方法
    • params获取的是数组集合,可以直接使用数组的方法
ini 复制代码
const fn = (...params) => {
    console.log(params);//[10,20,30]
};
fn(10,20,30);
  • 箭头函数没有自己的this,函数中出现的this是其上级上下文中的this
php 复制代码
let obj = {
    name:'zhufeng',
    fn: () => {
        // 它没有this,this是其上级上下文中的this:window
    }
}
obj.fn();
  • 箭头函数没有prototype属性,所以不能被new执行

面向对象

编程语言:

面向过程 POP :C语言 编程语言之母

面向对象 OPP Object Oriented Programming

    • java 编程语言之父
    • JavaScript
    • PHP/Python/Ruby/Go/C#(ASP.NET)/C++/VB...

面向对象是一个非常伟大的编程思想,而JS就是基于这个思想构建出来的一门编程语言,所以在JS中存在:对象、类、实例三个概念!!

对象

JS中一切我们学习和使用的东西都是对象(研究对象)【泛指】"万物皆对象"

类

按照特征特点,把事物进行归纳分类【大类(父类)--> 小类(子类)】;而且类一定会赋予它的每个成员一些公共的属性和方法。

类/构造函数

所有的类(构造函数)都是函数类型的

javascript 复制代码
console.log(typeof Number); //=>"function"
console.log(typeof Object); //=>"function"
console.log(typeof Fn); //=>"function"

实例

具体的事物,类中的每一个具体的成员;每一个实例都具备一些自己独有的属性和方法(私有特征),也会具备类赋予它的公共属性和方法(公有特征)。

大部分实例都是对象类型的值,但是"原始值类型"的值,从本质上也是自己所属类的实例,例如:1是Number类的实例,那么1也是一个实例,但是它属于原始值中的"number"类型。也就是说,大部分的实例都是对象类型,除了原始值类型的实例外。

相关推荐
2603_965896628 分钟前
Grid 网格布局|CSS 二维页面排版体系
前端·css
有味道的男人24 分钟前
搜好货平台关键词商品搜索接口:分页容错与商品数据轻量化提取方案
服务器·前端·javascript
lovingsoft1 小时前
Chrome Lighthouse 详解
前端·chrome
Qlly1 小时前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝1 小时前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦1 小时前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡2 小时前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI2 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95272 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端
看浪的路人2 小时前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring