我曾经因为索赔而单独使用ES6类语法而被责骂#34;没有必要对单例进行原型设计,因为永远不需要实例化'不止一次,暗示明确的定义是充分的。"然而,由于认识到明确的定义是充分的,我不知道如何将单例包装到类定义中是不好的做法。
在这个问题Converting Singleton JS objects to use ES6 classes中,@ Jason_Sebring说原型单体可能会影响生产力 - 好像添加一些额外代码行的任务对生产力造成了一些不可接受的损害。
还有一些人推广使用ES6类语法来生成像这样的单例http://amanvirk.me/singleton-classes-in-es6/
归根结底,在我看来,这归结为一个偏好问题。我更喜欢类/原型语法,因为我主观上更喜欢代码组织。但是,如果有人指出应该避免使用单例类的技术原因,我准备转换。
所以我问下面的问题,是否有任何技术原因可以避免单身人士课程?
编辑以响应@loganfsmyth:
上周,我需要在浏览器中从客户端本地设备捕获媒体。我发现npm上没有真正做到我想要的模块所以我自定义了一个。这是一个单例的例子 我从一个类转换过来的模块。
function hasGetUserMedia() {
return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia);
}
module.exports = {
createStream : (width,height)=>{
return new Promise((resolve, reject)=>{
if(hasGetUserMedia()){
//setup video
navigator.getUserMedia({audio: true,video:true}, (localMediaStream) =>{
var video = document.createElement('video');
video.src = window.URL.createObjectURL(localMediaStream);
video.width = width;
video.height = height;
var recorder = new MediaRecorder(localMediaStream);
resolve({
video : video,
recorder : recorder,
stream : stream
});
},
(err) =>{
reject(err);
});
}
else{
reject(new Error('no_valid_user_media'));
}
});
}
takePhoto: (scale,video,mimetype,quality)=>{
return new Promise((resolve,reject)=>{
if(!video){
reject(new Error('no_stream_exist'));
return;
}
var canvas = document.createElement("canvas");
canvas.width = video.videoWidth * scale;
canvas.height = video.videoHeight * scale;
canvas.getContext('2d')
.drawImage(video, 0, 0, canvas.width, canvas.height);
canvas.toBlob(canvas,(blob)=>{
resolve(blob);
},mimetype,quality);
});
}
takeVideo : (recorder,video,sampleRate,duration,mimetype)=>{
return new Promise((resolve,reject)=>{
if(!video){
reject(new Error('no_stream_exist'));
return;
}
var chunks = [];
recorder.ondataavailable = (e)=>{
chunks.push(e.data);
}
recorder.start(sampleRate);
setTimeout(()=>{
recorder.stop();
resolve(new Blob(chunks,{type:mimetype}));
},duration);
});
}
uploadMedia : (blob,streamName,socket,progressCallback)=>{
return new Promise((resolve, reject)=>{
var stream = ss.createStream();
ss(socket).emit(streamName,stream,{});
ss.createBlobReadStream(blob).pipe(stream);
stream.on('finish',()=>{
resolve();
});
stream.on('error',(err)=>{
reject(err);
});
if(progressCallback){
stream.on('data',(chunk)=>{
progressCallback(chunk);
});
}
});
}
}