如何强制javascript类忽略输出中外部添加的字段

如何强制javascript类忽略输出中外部添加的字段,javascript,javascript-objects,Javascript,Javascript Objects,**编辑** 对于给定的javascript函数X X=function(obj){ /* code here */ } 如何修改函数X,使其 i1=new X({a:1,b:2}); i1.c=3; console.log(i1) to output as -> {a:1,b:2} 因此,忽略外部添加的属性“c”您可以尝试重写ToString方法: X.prototype.toString = function() { return this.a + " " + th

**编辑** 对于给定的javascript函数X

X=function(obj){
  /* code here */
}
如何修改函数X,使其

i1=new X({a:1,b:2});
i1.c=3;

console.log(i1) to output as -> {a:1,b:2} 

因此,忽略外部添加的属性“c”

您可以尝试重写ToString方法:

X.prototype.toString = function()
{
    return this.a + " " + this.b;
}

如果在
es2015
中使用
proxy
设置属性值可能是一个陷阱,因此您可以使用它检查即将设置的属性是否为外部属性

已更新以解决期望通过构造函数设置属性的请求

不过,它可能更适合使用,不知道,也吸取了教训

X=功能(道具){
//如果给定输入对象,则复制属性
if(对象的属性实例){
var键;
用于(键入道具){
if(属性hasOwnProperty(键)){
此[键]=道具[键];
}
}
}
//包装一个代理。
返回新代理(此{
集合:函数(目标、属性、值、接收者){
//无论如何,检查要设置的属性是否为外部属性。
if(目标[属性]的类型=='未定义'){
控制台日志(“否”);
}否则{
目标[财产]=价值;
}
返回true;
}
})
};
i1=新的X({a:1,b:2});
i1.c=3;
console.log(i1);
i1.a=2;

console.log(i1)您可以使用该方法,该方法阻止向对象添加新的自己的属性:

var X = function() {
  this.a = 1;
  this.b = 2;
  Object.preventExtensions(this);
};

var i1 = new X();
i1.c = 3;

console.log(i1); // prints "{a: 1, b: 2}"
console.log(i1.c); // prints `undefined`
请在此查看完整的示例。

请注意,在
严格模式下向不可扩展对象添加新的own属性会引发
类型错误

您不能这样做。是否要防止有人可以这样做
i1.c=3或是否允许
i1.c=3以便
console.log(i1.c)
将显示
3
,但将其隐藏在
console.log(i1)
中?非常抱歉,在我编辑问题时,您能否重新检查我的帖子。@epascarlo这是可能的。检查我的答案。这将无法正常工作,因为内部对象在未初始化时被分配了属性。
未捕获类型错误:无法将属性“a”设置为未定义(…)
您可以将内部对象初始化为
This.inner={}
。这将允许您向内部对象添加属性是的,对不起,忘记了。我更新了我的答案谢谢你的回答。但是我真的很抱歉,你能在我编辑问题的时候重新检查我的帖子吗。一个很好的答案。我不知道这件事。然而,我真的很抱歉,但你能重新检查我的帖子,因为我编辑了这个问题。我期望通过构造函数设置属性。其次,我不认为这个解决方案对nodejs有效。