木灵鱼儿
阅读:157
第六章 设计模式
本章比较水,就写一个js实现的单例模式吧
单例模式
function Test() {
//有缓存了直接抛出缓存
if (typeof Test.instance === "object") {
return Test.instance;
}
//其他逻辑代码
...
//缓存并抛出
Test.instance = this;
return this;
}
var a = new Test();
var b = new Test();
console.log(a === b); //true
使用这种方式非常简单,但是会存在一个问题就是instance
属性是一个公开属性,它有可能会被修改。
闭包
为了防止instance
静态属性被修改,我们可以使用闭包的方式
function Test() {
var instance = this;
//用户逻辑
...
//重写
Test = function() {
return instance;
};
}
var a = new Test();
var b = new Test();
console.log(a === b); //true
使用这种方式可以防止instance被修改,但是会有一个新的问题:instance被初始化后就无法在给原型添加新属性了
function Test() {
var instance = this;
//用户逻辑
// ...
//重写
Test = function() {
return instance;
};
}
//初始化之前可以加属性
Test.prototype.getName = function() {
console.log("test");
};
var a = new Test();
//初始化之后就不行了
Test.prototype.getAge = function() {
console.log(16);
};
var b = new Test();
console.log(a === b); //true
a.getName(); //test
b.getName(); //test
a.getAge(); // is not a function
b.getAge(); // is not a function
由于复写了构造函数,除了属性无法添加,constructor指针也不能这么去对比了:
a.constructor === Test; //false
为了能解决这些问题,我们需要再调整一下!
var Test = (function() {
var instance;
return function() {
if (instance) {
return instance;
}
//初始化
instance = this;
//用户逻辑
//...
// return instance; 隐式return了,可以不写
};
})();
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
第五章 代码复用模式
代码复用是一个既重要又有趣的话题。如果你面对自己或者别人已经写好的代码,而这些代码又是经过测试的、可维护的、可扩展的、有文档的,这时候你只想写尽量少且可以被复用的代码就是一个再自然不过的想法。当我们说代码复用的时候,第一件想到方式就是继承,为此你可能看到JavaScript很多方式用于实现“继承”。什么是类?如果有一个过程,这个过程能产生一个实例,实例是对象,那这个过程就是类。JavaScript是基于原型面向对象程序设计的,那么它的继承方式也是基于原型实现的,而JavaScript是没有类的,只有构造函数,且支持new用法,所以看上去就和类的用法相似,但是本质还是一个函数,而继承也是一...
第四章 对象的创建
命名空间在ESM模块化还未出来之前,用于减少全局变量名污染的一种做法就是使用命名空间,其做法也非常简单,就是创建一个全局的变量,然后将内容都赋值给这个变量,从而减少对全局变量的使用。//创建命名空间 var MYAPP = {}; //构造函数 MYAPP.Parent = function(){}; MYAPP.Child = function(){}; // 一个变量 MYAPP.some_var =1; // 一个对象容器 MYAPP.modules ={}; // 嵌套的对象 MYAPP.modules.module1 ={}; MYAPP.modules.module1...
第一章 基本技巧
尽量少用全局变量全局变量污染是一个老生常谈的问题,在es5时代常见的做法就是使用函数作用域隔离,es6时const、let出现,我们还可以直接在块级作用域中声明。相对于使用,我们通过一些代码来回顾一下全局变量污染所带来的问题。全局作用域中是存在this的,this就等于window,只是浏览器为了方便,用window来表示全局对象本身。function sum(x, y) { result = x + y; return result; } console.log(result); //Uncaught ReferenceError: result is not def...
代理模式
目录什么是代理模式?代理模式常见的两种实现方式为什么要使用代理而不是直接在源对象做修改呢?代理与适配器和装饰器之间的区别什么时候使用代理什么是代理模式?为一个对象提供一个替身对象(代理对象),以便对于源对象的控制和访问,某些时候我们没法直接引入源对象或者源对象不满足需要时,可以通过替身对象来进行中介和控制。代理模式主要分为三个角色:客户端(我),代理类,目标类;客户 ------> 源对象客户 ------> 代理 -------> 源对象比如说我有一个业务需求,我需要一个能自动过期数据的一个数据存储对象,那么从所有能存数据的对象中,map是最佳的,因为它有has,s...
什么是面向对象与设计模式
面向对象对于面向对象的理解,千人千面,不同的人有不同的解读,这里就以我个人所了解的知识给大家解释一下面向对象。历史角度我们先从历史的角度去看!计算器在发明之初,处理的能力是有限的,所有的代码编辑都需要根据“机器语言(二进制)”来进行编写。这显然非常痛苦。那么如果我们把二进制换成一个个单词(助记符单词),是不是又更好一点了呢,于是“汇编语言”诞生了,但是使用上也就被机器语言强那么一点点。那么有没有比汇编语言更好用的呢?于是面向过程的C语言出现了,c的位置处于机器与人的中间点,既没有偏向人的思维模式,也没有偏向机器语言思维。可以说c语言的底层结构是机器语言,但是它将机器语言封装成自己的语法,...
