【发布时间】:2016-02-10 07:11:46
【问题描述】:
是否可以仅为 {}-Objects 定义原型?
在 Javascript 中,几乎所有东西都是对象。
Object.prototype.test = function() {
alert("test");
}
所有对象(包括数字、字符串和数组)都将具有此方法。 但我只想要一个结构对象。 > {...}
您可以先为对象创建所有原型,然后将其从其他对象(如 Number、String 和 Array)中删除。
// Overwrite
Array.prototype.test = undefined; // or delete property
这“有效”...原型被覆盖。但密钥仍然存在。
// Show all keys
for (key in arr)
{
alert(key); // print index of array AND keynames
}
我正在寻找最优雅的方式来做到这一点。
【问题讨论】:
-
不要修改
Object原型,除非您打算让该属性在每个对象上都可用,而您声明不希望这样做。无论如何,修改Object原型几乎总是一个坏主意。相反,您应该将该属性放在您控制的某个类的原型上,并根据需要从该原型继承。 -
另外,从
Array原型中删除属性不会做你想要的。在数组上调用test仍然会运行该函数,因为它会沿着原型链向上并在Object原型上简单地调用test:jsfiddle.net/x2wysox8 -
不要从
Array.prototype中删除属性test,如果你想限制对Object.prototype.test方法的访问,只需在调用时抛出一个错误。但是向Object.prototype添加方法是不好的做法,在这样做之前要三思而后行 -
确实!删除不是正确的方法。谢谢!覆盖作品。但这不是最好的方法。不幸的是,对象 {} 没有自己的名称,例如数字或字符串。数组的类似问题。数组类型是“对象”而不是“数组”。实在是太可惜了。您必须检查实例或 Array.isArray。但这是另一个话题。 :)
-
你为什么不这样做:
Object.test = function(){};?并在函数内部检查调用者的类型,然后调用函数,如:Object.test({a:"b"});
标签: javascript object key prototype