如何在Javascript中修改不可配置、不可写的属性?
我正在写一个简单的事件发射器ES5 目标是确保如何在Javascript中修改不可配置、不可写的属性?,javascript,events,event-handling,dom-events,Javascript,Events,Event Handling,Dom Events,我正在写一个简单的事件发射器ES5 目标是确保EventEmitter实例上的所有属性都是 不可写且不可配置。“ 在绞尽脑汁6个小时后,我仍然不知道如何增加listenerCount,例如,如果可配置描述符设置为false 以下是我所拥有的一个例子: var eventEmitter = function(){ var listeners = listeners || 0; var events = events || {}; Object.defineProperties(thi
EventEmitter
实例上的所有属性都是
不可写且不可配置。“
在绞尽脑汁6个小时后,我仍然不知道如何增加listenerCount
,例如,如果可配置
描述符设置为false
以下是我所拥有的一个例子:
var eventEmitter = function(){
var listeners = listeners || 0;
var events = events || {};
Object.defineProperties(this, {
listeners: {
value : 0,
configurable: false,
writable: false
},
events: {
value: {},
configurable : false,
writable: false
}
});
return this;
};
eventEmmitter.prototype.on = function(ev, cb) {
if (typeof ev !== 'string') throw new TypeError("Event should be type string", "index.js", 6);
if (typeof cb !== 'function' || cb === null || cb === undefined) throw new TypeError("callback should be type function", "index.js", 7);
if (this.events[ev]){
this.events[ev].push(cb);
} else {
this.events[ev] = [cb];
}
this.listeners ++;
return this;
};
我建议使用IIFE(立即调用的函数表达式): 现在您可以执行以下操作:
coolObj.getA();//1
coolObj.getA();//2
coolObj.a;//undefined
coolObj.nonpublic;//undefined
coolObj.nonpublic.a;//undefined
我知道这不是您期望的答案,但我认为这是做类似事情的最简单方法。您可以使用需要密钥的代理来定义属性:
函数createObject(){
var key={可配置:true};
return[new Proxy({}{
定义属性(目标、道具、描述){
如果(描述值===键){
返回Reflect.defineProperty(目标、道具、键);
}
}
}),键];
}
函数func(){
var[obj,key]=createObject();
key.value=0;
Reflect.defineProperty(obj,“value”,{value:key});
key.value=函数(){
key.value=obj.value+1;
Reflect.defineProperty(obj,“value”,{value:key});
};
Reflect.defineProperty(obj,“增加”{value:key});
返回obj;
}
var obj=func();
console.log(obj.value);//0
试试{obj.value=123;}catch(err){
试试{Object.defineProperty(obj,“value”,{value:123});}catch(err){}
console.log(obj.value);//0
目标增加();
console.log(obj.value);/1
您…不修改它们吗?具体要求是什么?您可以使用局部变量和getter方法,或者使用getter属性作为解决方法。@Sua,请添加更新。
coolObj.getA();//1
coolObj.getA();//2
coolObj.a;//undefined
coolObj.nonpublic;//undefined
coolObj.nonpublic.a;//undefined