在我增强 JavaScript 能力的过程中,我接受了添加方法的挑战,myMethod()
,到可以在给定对象上调用的 JavaScript 对象类,myObject
,以便操纵其内容。
我已经添加了 myMethod()
到对象原型(prototype)并遍历myObject
通过myObject.myMethod()
;但是,我遇到了一个奇怪的问题:在给定对象的末尾, myMethod()
打印为值 myObject
尽管据我所知,不应该如此。
Object.prototype.myMethod = function()
{
for (var key in this)
{
console.log(this[key]);
}
}
function processData(input)
{
//Enter your code here
var myObject = JSON.parse("{ \"myParam\": \"myValue\", \"anotherParam\": 123 }");
myObject.myMethod();
}
以下是此代码的输出:
myValue
123
[Function]
改变myObject[key]
至myObject[key].toString()
有以下输出:
myValue
123
function ()
{
for (var key in this)
{
console.log(this[key].toString());
}
}
我正在使用 Node.js 运行时在 WebStorm 中执行此脚本。
本次挑战的要求仅需要 myObject
的内容,我不知道如何停止myMethod()
从出现在这里。我有什么遗漏的吗?
最佳答案
In my journey to become stronger in JavaScript, I have taken up a challenge to add a method,
myMethod()
, to the JavaScriptObject
class that can be called on a givenObject
,myObject
, in order to manipulate its contents.
请注意,这种做法会被严重反对(在 2017 年,可能超出了绝对必要的程度*)。扩展任何内置原型(prototype)都有点令人担忧,但扩展 Object.prototype
特别有问题,因为当然,几乎所有对象都继承自它。
但是,如果您要扩展原型(prototype),则通过 Object.defineProperty
添加不可枚举属性非常重要或类似:
Object.defineProperty(Object.prototype, "myMethod", {
value: function() { /* ... */ }
});
enumerable
的默认值为false
,因此它不会出现在for-in
循环中,Object.keys
数组等
* “不要扩展内置原型(prototype)”的口号在 ES5 引入定义不可枚举属性的方法(例如 defineProperty
)之前就开始了。现在我们可以定义不可枚举的属性,主要关注的是脚本间冲突,每个脚本都尝试对某些内容使用相同的名称,或者与添加到 JavaScript 中的新功能发生冲突。
关于javascript - 添加到 JavaScript 对象类的方法在遍历给定对象时出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680790/