单例设计模式(singleton pattern)
var name = "陆相莹";
var age = 18;
var sex = "girl";
var name = "刘司南";
var age = 81;
var sex = "boy";
var person1={
name:"陆相莹",
age:18
};
var person2={
name:"刘司南",
age:81
};
1.表现形式
var obj = {
xxx:xxx,
...
};
单例设计模型中,OBJ不仅仅是对象名,它被称为“命名空间[NameSpace]”,把描述事务的属性存放到命名空间中,多个命名空间是独立分开的,互不冲突(每个实例和每个实例之间互不影响)
2.作用
把描述同一件事务的属性和特征进行“分组、归类”(存储在同一个堆内存空间中),避免了全局变量之间的冲突和污染
3.单例设计模式命名的由来
每一个命名空间都是JS中Object这个内置基类的实例,而实例之间是相互独立互不干扰的,所以我们称它为“单例:单独的实例”
高级单例模式
模型:对象包在匿名自执行函数里返回
在给命名空间赋值的时候,不是直接赋值一个对象,而是先执行匿名函数,形成一个私有作用域AA(不销毁的栈内存),在AA中创建一个堆内存,把堆内存地址赋值给命名空间
var nameSpace = (function () {
var n = 12;
function fn() {
//...
}
function sum() {
}
return {
fn: fn,
sum: sum
}
})();
好处:我们完全可以在AA中创造很多内容(变量OR函数),哪些需要供外面调取使用的,我们暴露到返回的对象中(模块化实现的一种思想)
工厂模式(Factory Pattern)
function createPerson(name, age) {
var obj = {};
obj.name = name;
obj.age = age;
return obj;
}
var p1 = createPerson('xxx', 25);
var p2 = createPerson('xxx', 25);
1.把实现相同功能的代码进行“封装”,以此来实现“批量生产”(后期想要实现这个功能,我们只需要执行函数即可)
2.“低耦合高内聚”:减少页面中的冗余代码,提高代码的重复使用率
耦合是指某两个事物之间如果存在一种相互作用、相互影响的关系,
内聚 是一个模块内部各个元素彼此结合的紧密程度
面向对象理解
JS本身就是基于面向对象设计和开发出来的一门语言,在js中提供了很多的大类和小类,我们在来开发中都是基于类,基于实例完成的,所以说我们操作js就是在面线对象编程。
基于构造函数创建自定义类(constructor)
没有new 普通函数执行
有new 构造函数执行
构造函数执行,当前的函数名称之为“类名”,接收的返回结果是当前类的一个实例
在 JavaScript 中,判断一个变量的类型常常会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。
typeof:判断基本变量的类型
instanceof:检测某一个实例是否隶属于这个类
普通函数执行
1.形成一个私有的作用域,形参赋值,变量提升
2.代码执行
3.栈内存释放问题
构造函数执行
代码执行前,创建一个堆内存,函数主体的this指向它
代码执行完,return ‘this地址’
若自己写了return 基本值不影响返回this,引用值则返回自己写的引用值
return;结束代码执行,不影响返回this
原型prototype
1.所有的函数数据类型都天生自带一个属性:prototype(原型),这个属性的值是一个对象,浏览器会默认给它开辟一个堆内存
2.在浏览器给prototype开辟的堆内存中有一个天生自带的属性:constructor,这个属性存储的值是当前函数本身
3.每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定它是谁的实例,都是Object的实例)