Reputation: 1
I want to generate a GUID string via the answer.
'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);
});
Now, I want to put it into toString
function, like: GUID.NewGuid().toString()
.
I've tried (not working):
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;
};
Uncaught TypeError: Cannot read property 'toString' of undefined
console.log(GUID.NewGuid().toString());
What I want to achieve: using syntax GUID.NewGuid().toString()
to generate an id.
How to fix it?
Upvotes: 3
Views: 1189
Reputation: 1
window[Symbol.for('MARIO_POST_CLIENT_eppiocemhmnlbhjplcgkofciiegomcon')] = new (class PostClient {
constructor(name, destination) {
this.name = name;
this.destination = destination;
this.serverListeners = {};
this.bgRequestsListeners = {};
this.bgEventsListeners = {};
window.addEventListener('message', (message) => {
const data = message.data;
const isNotForMe = !(data.destination && data.destination === this.name);
const hasNotEventProp = !data.event;
if (isNotForMe || hasNotEventProp) {
return;
}
if (data.event === 'MARIO_POST_SERVER__BG_RESPONSE') {
const response = data.args;
if (this.hasBgRequestListener(response.requestId)) {
try {
this.bgRequestsListeners[response.requestId](response.response);
}
catch (e) {
console.log(e);
}
delete this.bgRequestsListeners[response.requestId];
}
}
else if (data.event === 'MARIO_POST_SERVER__BG_EVENT') {
const response = data.args;
if (this.hasBgEventListener(response.event)) {
try {
this.bgEventsListeners[data.id](response.payload);
}
catch (e) {
console.log(e);
}
}
}
else if (this.hasServerListener(data.event)) {
try {
this.serverListeners[data.event](data.args);
}
catch (e) {
console.log(e);
}
}
else {
console.log(`event not handled: ${data.event}`);
}
});
}
emitToServer(event, args) {
const id = this.generateUIID();
const message = {
args,
destination: this.destination,
event,
id,
};
window.postMessage(message, location.origin);
return id;
}
emitToBg(bgEventName, args) {
const requestId = this.generateUIID();
const request = { bgEventName, requestId, args };
this.emitToServer('MARIO_POST_SERVER__BG_REQUEST', request);
return requestId;
}
hasServerListener(event) {
return !!this.serverListeners[event];
}
hasBgRequestListener(requestId) {
return !!this.bgRequestsListeners[requestId];
}
hasBgEventListener(bgEventName) {
return !!this.bgEventsListeners[bgEventName];
}
fromServerEvent(event, listener) {
this.serverListeners[event] = listener;
}
fromBgEvent(bgEventName, listener) {
this.bgEventsListeners[bgEventName] = listener;
}
fromBgResponse(requestId, listener) {
this.bgRequestsListeners[requestId] = listener;
}
generateUIID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
})('MARIO_POST_CLIENT_eppiocemhmnlbhjplcgkofciiegomcon', 'MARIO_POST_SERVER_eppiocemhmnlbhjplcgkofciiegomcon')
Upvotes: 0
Reputation: 24181
To make @Nina's code act the way I would expect, and you want the late evaluation during toString,. One idea is to alter the object's toString after evaluation, basically create a late binding function on the object, rather than the prototype.
I use this technique often to create late binding methods, some methods could be expensive and doing init's during construction could be time consuming. In this case I'm not sure there is a massive performance boost, but it's a good example of doing it.
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.
Upvotes: 3
Reputation: 386560
You need an instance of the class.
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());
Upvotes: 5