如何在Javascript中修改不可配置、不可写的属性?

如何在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

我正在写一个简单的事件发射器ES5

目标是确保
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