覆盖函数的toString函数

时间:2016-10-17 10:06:37

标签: javascript

我想通过the answer生成GUID字符串。

'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
    return v.toString(16);
});

现在,我想将其放入toString函数中,例如:GUID.NewGuid().toString()

我已经尝试过(不工作):

let GUID = function () {};
GUID.NewGuid = function () {};

GUID.NewGuid.prototype.toString = function () {
    let guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });

    return guid;
};
  

未捕获的TypeError:无法读取属性' toString'的   未定义console.log(GUID.NewGuid().toString());

我想要实现的目标:使用语法GUID.NewGuid().toString()生成ID。

如何解决?

2 个答案:

答案 0 :(得分:5)

你需要一个instance的课程。

var guid = new GUID.NewGuid;



let GUID = function () {};
GUID.NewGuid = function () {};

GUID.NewGuid.prototype.toString = function () {
    let guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
    return guid;
};

var guid = new GUID.NewGuid;

console.log(guid.toString());




答案 1 :(得分:3)

让@Nina的代码按照我期望的方式行事,并且你希望在toString期间进行后期评估。一个想法是在评估后改变对象的toString,基本上在对象上创建一个后期绑定函数,而不是原型。

我经常使用这种技术来创建后期绑定方法,某些方法可能很昂贵,并且在构建期间执行初始化可能非常耗时。在这种情况下,我不确定是否会有很大的性能提升,但这是一个很好的例子。



let GUID = function () {};
GUID.NewGuid = function () {};

GUID.NewGuid.prototype.toString = function () {
    let guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
    this.toString = function() { return guid; }; //add this..
    return guid;
};

var guid = new GUID.NewGuid;

console.log(guid.toString()); //these two
console.log(guid.toString()); //want to equal the same

guid = new GUID.NewGuid;

console.log(guid.toString()); //now I want a new one.