Javascript 重写函数的toString函数

Javascript 重写函数的toString函数,javascript,Javascript,我想通过生成GUID字符串 现在,我想把它放到toString函数中,比如:GUID.NewGuid().toString() 我试过(不工作): 未捕获的TypeError:无法读取的属性“toString” 未定义的console.log(GUID.NewGuid().toString()) 我想要实现的是:使用语法GUID.NewGuid().toString()生成id 如何修复它?您需要一个类的名称 var guid = new GUID.NewGuid; let GUID=fun

我想通过生成GUID字符串

现在,我想把它放到
toString
函数中,比如:
GUID.NewGuid().toString()

我试过(不工作):

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

我想要实现的是:使用语法
GUID.NewGuid().toString()
生成id

如何修复它?

您需要一个类的名称

var guid = new GUID.NewGuid;
let GUID=function(){};
GUID.NewGuid=函数(){};
GUID.NewGuid.prototype.toString=函数(){
让guid='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxx'。替换(/[xy]/g,函数(c){
设r=Math.random()*16 | 0,v=c=='x'?r:(r&0x3 | 0x8);
返回v.toString(16);
});
返回guid;
};
var guid=new guid.NewGuid;

console.log(guid.toString())以使@Nina的代码按我预期的方式运行,并且您希望在toString期间延迟评估,。一个想法是在评估后改变对象的toString,基本上在对象上创建一个后期绑定函数,而不是原型

我经常使用这种技术来创建后期绑定方法,有些方法可能很昂贵,在构建过程中执行init可能很耗时。在这种情况下,我不确定是否有巨大的性能提升,但这是一个很好的例子

let GUID=function(){};
GUID.NewGuid=函数(){};
GUID.NewGuid.prototype.toString=函数(){
让guid='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxx'。替换(/[xy]/g,函数(c){
设r=Math.random()*16 | 0,v=c=='x'?r:(r&0x3 | 0x8);
返回v.toString(16);
});
this.toString=function(){return guid;};//添加此。。
返回guid;
};
var guid=new guid.NewGuid;
console.log(guid.toString())//这两个
console.log(guid.toString())//你想和我一样吗
guid=新guid.NewGuid;

console.log(guid.toString())//现在我想要一个新的。
GUID.NewGuid=function(){return function toString(){}
let GUID={NewGuid:{toString:function(){}}
是否可以有一个GUID而不使用字符串作为此GUID的表示形式?@Tushar
GUID.NewGuid()
GUID.NewGuid
请@MohammadMc这会破坏全局范围。虽然完成这项工作很容易,但使用这样的toString会产生副作用似乎很奇怪,任何人在以后关注您的代码可能会有点困惑。就我个人而言,我会创建一个GUID类,它有一个函数,比如NewGuid(),返回一个具有toString()方法的对象,可以省略括号。使用
new
关键字调用静态函数?@HappyCoding使用
new
运算符调用构造函数。这是因为您引用的是类
guid
的同一实例。如果您想获得新id,请尝试引用新实例(
guid=new guid.NewGuid
),就像您检测到的那样)。@HappyCoding No,试试我说的
guid.toString()==guid.toString()
您将得到false,原因我已经解释过了。创建另一个实例完全没有意义,因为您的toString正在这样做。所以做
NewGuid.NewGuid
是毫无意义的,每次你想要一个新的GUID.toString()
时,你也可以做
GUID.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;
};
var guid = new GUID.NewGuid;