有没有办法给所有的对象一个方法而不修改Object.prototype?
我想用一个日志记录函数来扩充Node.js应用程序中的所有对象,以便每个对象都可以调用this.log
或使其log
函数由thatObject.log
引用。 我在这方面看到了许多优势:
log
功能,以便产生特殊的输出 log
功能,它可以在其原型链上找到log
功能,并且 this.log
引用Object.prototype.log
,在任何其他上下文中, this.log
引用该对象的log
。 例如:
Object.prototype.log = function(message) {
console.log(message);
};
function Person(name) {
this.name = name;
};
Person.prototype.log = function(message) {
console.log(this.name + " says " + message);
};
function Ghost() {
};
var joe = new Person("joe");
joe.log("Hi!"); //"Joe says Hi!"
var boo = new Ghost();
boo.log("Boo!"); //"Boo!"
//I can call this in any object context, and get a context-specific message
//This includes the global context, like so
this.log("Log!"); //"Log!"
不幸的是,由于外部依赖性的限制,我无法修改Object.prototype(不只是一个命名空间问题)。 有没有办法做到这一点而不修改Object.prototype?
最重要的是,我想保留从任何地方调用this.log
的行为。
更新:我找到了解决这个特定问题的方法。 请参阅下面的答案。
如果你想添加一些属性到一个对象,你可以添加它作为一个属性(如果你有一个对象的引用),或者在其原型链中的某个地方。
在这种情况下,您想将其添加到所有对象。 我认为这是合理的假设你没有提及所有这些。 所以唯一的方法是在原型链中添加属性。
例如,您可以将该属性添加到Array.prototype
, Function.prototype
,...
但是,这不会影响不从这些继承的对象。 特别是,创建对象的常用方法是使用对象初始值设定项: {}
。 这些对象只能从Object.prototype
继承。
因此,对于那些, Object.prototype
是您唯一的选择 。
但是,这还不够 。 可以创建不从Object.prototype
继承的对象。 例如Object.create(null)
。
所以不,这是不可能的 。 国际海事组织这是一件好事 ,因为你不应该污染你不拥有的物体。
正如Oriol已经指出的那样,不可能。 这里有几个选择:
var log = function(message) {
var msg = message || '';
console.log(JSON.stringify(this) + msg);
}
//later in the code
log.call(this, 'Log!'); //prints the stringified Object plus 'Log!'
如果你使用构造函数,另一个选择就是让所有的构造函数都继承自所需方法的构造函数(尽管承认这不符合你的“甚至全局上下文”的要求)。
链接地址: http://www.djcxy.com/p/27243.html
上一篇: Is there a way to give all Objects a method without modifying Object.prototype?