关于JS单例模式的一个问题

发布于 2022-09-11 14:50:38 字数 492 浏览 35 评论 0

function Demo(name) {
    this.name = name;
}
var getSingle = function(fn) {
    var result;
    return function() {
        console.log(arguments.length);
        return result || (result = fn.apply(this, arguments));
    }
};
const aa = new getSingle(Demo)('a');
const bb = new getSingle(Demo)('b');
console.log(aa === bb); //true
console.log(aa.name); // TypeError: aa is undefined
console.log(bb); // undefined

为什么aa.namebb未定义呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我的影子我的梦 2022-09-18 14:50:38

图片描述

这个是在终端打出的结果,中文翻译,你认为的name并不能够读取到,

何以心动 2022-09-18 14:50:38

const aa = new (getSingle(Demo))('a'); 加括号可以解决undefined的问题,
但是单例不是这么写的:
result = fn.apply(this, arguments):result永远为undefined,这明显是写错了;
而且每次执行getSingle 都会var result,光这一点就可以看出来这绝对不是单例写法了

神仙妹妹 2022-09-18 14:50:38
function Demo(name) {
        this.name = name;
    }
    var getSingle = function(fn) {
        var result;
        return function() {
            console.log(arguments.length);
            return result || (result = fn.apply(this, arguments));
        }
    };
    const ss=getSingle(Demo);
    const aa = new ss('a');
    const bb = new ss('b');
    console.log(aa === bb);
    console.log(aa.name);
    console.log(bb);
    const m=new (getSingle(Demo))('m');
    console.log(m.name);
    const m2=new (getSingle(Demo))('m2');
    console.log(m==m2);

1.运算符优先级的问题
2.每次走getSingle 都会重新定义result 返回新function 所以你那样调即便成功了也不会相等

债姬 2022-09-18 14:50:38

--------更新
需用借用ES6的语法,ES5的话我实在想不出来

function Demo(name) {
    this.name = name;
}

let getSingleBuilder = function (fn) {
    let result;
    return function () {
        return result || (result = new fn(...arguments));
    }
};

let SingleDemo = getSingleBuilder(Demo);

const aa = new SingleDemo('a');
const bb = new SingleDemo('b');
console.log(aa === bb); // true

-------------原答案

运算符优先级问题,加上两个括号就好了,否则会把getSingle当作了构造函数。
运算符优先级

const aa = new (getSingle(Demo))('a');
const bb = new (getSingle(Demo))('b');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文