Javascript 为对象指定函数

Javascript 为对象指定函数,javascript,Javascript,我想向JSON对象添加函数,但我找不到分配给所有对象的函数,只能分配给一个对象 此代码适用于数组: Object.defineProperty(Array.prototype,'random'{ 值:()=>{ 返回此[Math.floor(Math.random()*this.length)]; }, }); 我还发现了以下代码: const obj={name:'Bob'}; obj.fullName=函数(){返回this.name} 但这只适用于特定对象,而不是所有对象 是否可以为所

我想向JSON对象添加函数,但我找不到分配给所有对象的函数,只能分配给一个对象

此代码适用于数组:

Object.defineProperty(Array.prototype,'random'{
值:()=>{
返回此[Math.floor(Math.random()*this.length)];
},
});
我还发现了以下代码:

const obj={name:'Bob'};
obj.fullName=函数(){返回this.name}
但这只适用于特定对象,而不是所有对象


是否可以为所有JSON对象编写全局函数?如果可以,则如何编写?

您可以将
函数添加到
对象。prototype
。请注意,这不是一个很好的实践,因为它可能会影响代码的其余部分(如注释中所示):

Object.prototype.fullName=function(){返回this.name;};
const obj={name:'Bob'};

log(obj.fullName())
您可以将
函数添加到
对象。prototype
。请注意,这不是一个很好的实践,因为它可能会影响代码的其余部分(如注释中所示):

Object.prototype.fullName=function(){返回this.name;};
const obj={name:'Bob'};

log(obj.fullName())
您可以在
对象.prototype
上添加属性,但我不建议这样做。请注意,不建议更改全局对象原型。我还要注意的是,第一段代码有一个bug-arrow函数不会引用正确的
this
。另一个注意:这与JSON无关。你说的是JS对象文字。JSON根本不接受函数。你知道向JS中的所有对象添加方法基本上意味着向所有对象添加方法吗?对象、原语、函数、一切;除了
null
undefined
和您可能创建的少数
Object.create(null)
。也许这有点过分?您可以在
对象.prototype
上添加属性,但我不建议这样做。请注意,不建议更改全局对象原型。我还要注意的是,第一段代码有一个bug-arrow函数不会引用正确的
this
。另一个注意:这与JSON无关。你说的是JS对象文字。JSON根本不接受函数。你知道向JS中的所有对象添加方法基本上意味着向所有对象添加方法吗?对象、原语、函数、一切;除了
null
undefined
和您可能创建的少数
Object.create(null)
。也许这有点过分了?至于“我为什么不应该这样做?”:
for(让prop进入obj){console.log(prop);}
->“name”,“fullName”(
fullName
将出现在任何对象中)@blex公平地说,这是一个已知的问题
for..in
循环通常是一种不好的做法,除非a)您实际上想要原型链上的每个属性b)您只过滤到自己的属性。二十多年来一直如此。向原型添加内容的更大问题是,可能会与本机功能冲突。有趣的事实:这就是为什么字符串/数组上的
.includes()
没有被调用
.contains()
。Mootools库已经向本机原型添加了
.contains()
,新方法打破了这一点。ES必须修改。@VLAZ我自己不会在对象上使用
for in
,但我见过很多人这样做,因为它通常是有效的,所以我认为考虑这一点很重要。关于
.contains
的好消息,我不知道@因为太乱了。此外,这也是一个很好的例子,说明了为什么要避免向对象添加属性。关于..的
-老实说,这通常不是问题。当我使用它时,我确实需要所有属性。但这真的很少见<代码>对象。键
/
对象。条目
仅获取自己的属性,而且通常使用起来更方便。如果可能的话,我会尝试只过滤到我需要的属性。至于“为什么我不应该这样做?”:
for(让prop在obj中){console.log(prop);}
->“name”,“fullName”(
fullName
将出现在任何对象中)@blex公平地说,这是一个已知的问题
for..in
循环通常是一种不好的做法,除非a)您实际上想要原型链上的每个属性b)您只过滤到自己的属性。二十多年来一直如此。向原型添加内容的更大问题是,可能会与本机功能冲突。有趣的事实:这就是为什么字符串/数组上的
.includes()
没有被调用
.contains()
。Mootools库已经向本机原型添加了
.contains()
,新方法打破了这一点。ES必须修改。@VLAZ我自己不会在对象上使用
for in
,但我见过很多人这样做,因为它通常是有效的,所以我认为考虑这一点很重要。关于
.contains
的好消息,我不知道@因为太乱了。此外,这也是一个很好的例子,说明了为什么要避免向对象添加属性。关于..的
-老实说,这通常不是问题。当我使用它时,我确实需要所有属性。但这真的很少见<代码>对象。键
/
对象。条目
仅获取自己的属性,而且通常使用起来更方便。如果可能的话,我会尝试只过滤到我需要的属性。