javascript - js中单例模式疑惑
问题描述
以下代码
function Universe() { // 缓存的实例 var instance = this; // 其它内容 this.start_time = 0; this.bang = 'Big'; // 重写构造函数 Universe = function () {return instance; };}// 测试var uni = new Universe();var uni2 = new Universe();uni.bang = '123';console.log(uni === uni2); // trueconsole.log(uni2.bang); // 123
点击查看原文
问题:
new Universe()的过程是:var o = {};Universe.call(o);//这一步是将Universe中this对应的属性赋值给o;o.__proto__ = Universe.prototype;//将Universe原型上的方法赋值到o的__proto__属性上;
那么 var instance = this;中,this是不是指的是不同的对象o?那么重写构造函数后,返回的instance不就是不同的对象吗?为什么最后能相等
问题解答
回答1:因为重写了构造函数后, 返回一个对象, 这个对象会覆盖你 用new 构造函数生成的那个对象,不知道我有没有说清楚
回答2:@mpccc 说的对。
如果构造函数返回一个对象,那 new 出来的就是这个对象啦。
可以看看秘密花园中的构造函数这一段
回答3:我也是新手,尝试解答一下,要是错了可别怪我
第一 this是不是指的是不同的对象 在第一次调用构造函数的时候 产生一个空的对象 并且函数内部的this指向了这个空对象,接着执行代码,最后返回这个对象 也就是uni。
而在第二次调用的时候由于第一次函数的改写,产生了一个闭包,这个闭包的内部的instance正好指向了第一次调用时的产生的对象uni,当第二次执行new Universe()的时候你执行的是一个闭包,也会产生一个空的对象,但那个对象并没有用到它,反而是直接返回了闭包内部的instance也就是uni。
所以uni2 === uni.
回答4:偏个题,这样写单例模式有点多余,要创建唯一的对象不用非得造个构造函数
var single = function(fn){ var instance; return function(){ return instance || (instance = fn .apply(this, arguments)); } }; 回答5:
不是注释写了吗,重写了构造函数啊,你new了一次之后再new就没有var instance = this;这行代码了,instance自然就不变了
//简单打印一下就知道了console.log(Universe)var uni = new Universe()console.log(Universe)回答6:
首次执行new Universe()的时候,确实产生了一个新的this,并且将Universe构造函数改写了,之后再次调用这个new Universe()的时候,就只会return instance了,不会产生新的对象了。
相关文章:
1. node.js - nodejs debug问题2. python - flask post提交timestamp不能作为参数,这是为什么?3. spring-mvc - spring-session-redis HttpSessionListener失效4. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!5. 百度地图api - Android 百度地图 集成了定位,导航 相互的jar包有冲突?6. node.js - express框架,设置浏览器从缓存中读取静态文件,只有js从缓存中读取了,css还有一些图片为何没有从缓存中读取?7. 如何解决Centos下Docker服务启动无响应,且输入docker命令无响应?8. mysql - 一个sql的问题9. 做Redis集群的时候,可不可以将Master实例和Slave实例放在一个主机当中?10. javascript - 如何获取未来元素的父元素在页面中所有相同元素中是第几个?

网公网安备