用途: 设计模式 在echarts 中表现得淋漓尽致, init 初始化 系统文件, 单例模式,让每一个初始化,都是同一个,减少代码重复;例如:利用惰性函数,处理数据,浏览器兼容!
单例模式实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
设计模式 在echarts 中表现得淋漓尽致, init 初始化 系统文件, 单例模式,让每一个初始化,都是同一个,减少代码重复
<!-- -->
<script>
function Person() {
}
let p1 = new Person()
let p2 = new Person()
p1 == p2 // 为true 单例模式 特点 提出
</script>
<script>
// 单例 全局模式
let global;
function Person() {
if (global) {
return global
}
this.name = '我是全局模式!'
global = this;
}
let p3 = new Person();
let p4 = new Person()
console.log(p3, p4, p3 == p4)
</script>
<script>
// 静态属性
function Person() {
if (Person.foctry) {
return Person.foctry
}
this.name = '我是静态属性!'
Person.foctry = this
}
let p5 = new Person();
let p6 = new Person()
console.log(p5, p6, p5 == p6, '===')
Person.foctry = 'demo';
var p7 = new Person();
console.log(p5, p7, p5 == p7, '===')
</script>
<script>
// 惰性函数处理 单例模式
function Person() {
let global;
this.name = '我是惰性函数单例模式!'
global = this;
Person.prototype.name = '原始';
// 在这里重新 复制函数地址 (不是原来的 Person 函数了)
Person = function () {
return global;
}
}
Person.prototype.des = 'des'; // 第一次初始化的 原型对象
let p8 = new Person();
Person.prototype.hi = 'hi'; // 后面指的是 第一次初始化的原型对象
let p9 = new Person()
console.log(p8, p9, p8 == p9, '=====')
</script>
<script>
// 惰性函数的 原型链 继承
function Person() {
let global;
this.name = '我是实例继承,对象!'
// 3.利用惰性函数更新构造函数(赋值重写,下次利用)
Person = function () {
// this = obj2
// this = obj3
return global; // 第二次返回内容
}
Person.prototype = this // 原型 继承实例
global = new Person()
// 6.修正构造器属性
global.constructor = Person;
return global // 第一次初始化,内容
}
Person.prototype.des = 'des'; // 因为原型链 被替换 所以des 没有
let p10 = new Person();
Person.prototype.hi = 'hi'; // 后面指的是 第一次初始化的原型对象
let p11 = new Person()
console.log(p10, p11, p10 == p11, '=====')
</script>
<script>
// 全局变量 及时调用
let global1;
(function () {
var global1;
Person = function () {
if (global1) {
return global1;
}
this.name = '默认';
global1 = this;
}
})();
var p12 = new Person();
var p13 = new Person();
console.log(p12, p13, p12 == p13); // true
</script>
<script>
// 兼容性
var addEvent = (function () {
if (document.addEventListener) {
return function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if (document.attachEvent) {
return function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else {
return function (type, element, fun) {
element['on' + type] = fun;
}
}
})();
// new 默认下会 返回这个实例对象,因此函数调用,return; (代码重写)
var Person1 = (function () {
return Person1 = function () {
if (Person1.foctry) {
return Person1.foctry;
}
this.name = '默认';
Person1.foctry = this;
}
})()
var p14 = new Person1();
var p15 = new Person1();
console.log(p14, p15, p14 == p15); // true
</script>
</body>
</html>
单例模式二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>08-单例模式的实现方式04(惰性函数改进)</title>
<style>
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
步骤:
1.提供一个构造函数
2.在构造函数内部声明一个私有变量instance
3.利用惰性函数更新构造函数
4.设置新构造函数的原型对象是旧构造函数的原型对象
5.利用新构造函数创建对象并赋值给instance
6.修正构造器属性
7.通过instance设置属性或方法
8.返回instance
<script>
// 1.提供一个构造函数
function Person() {
// this = obj1
// 2.在构造函数内部声明一个私有变量instance
var instance;
// 3.利用惰性函数更新构造函数
Person = function () {
// this = obj2
// this = obj3
return instance;
}
// 4.设置新构造函数的原型对象是旧构造函数的原型对象(原型式继承)
// 设置新构造函数的原型对象是旧构造函数的一个实例(原型链继承)
// Stu.prototype = Person.prototype
// Stu.prototype = new Person();
// Person.prototype = this.__proto__;
Person.prototype = this;
// 5.利用新构造函数创建对象并赋值给instance
instance = new Person(); // instance = obj2
// 6.修正构造器属性
instance.constructor = Person;
// 7.通过instance设置属性或方法
instance.name = '默认';
// 8.返回instance
return instance;
}
Person.prototype.des = 'des';
var p1 = new Person(); // obj2
Person.prototype.hi = 'hi';
var p2 = new Person(); // obj2
// console.log(p1 == p2); // true
// console.log(p1.des); // des
// console.log(p2.des); // des
//
// console.log(p1.hi); // hi
// console.log(p2.hi); // hi
console.log(p1.constructor == Person); // true
</script>
</body>
</html>