- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为我的 Node.js 应用程序中的所有对象增加一个日志功能,这样每个对象都可以调用 this.log
或拥有它的 log
功能由 thatObject.log
引用。我看到这样做有很多好处:
log
函数,使其产生特殊的输出,并且log
函数,它可以在其原型(prototype)链上找到一个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
的行为。
更新:我找到了解决此特定问题的方法。 See my answer below.
最佳答案
如果你想给一个对象添加一些属性,你可以把它添加为一个自己的属性(如果你有一个对象的引用),或者在它的原型(prototype)链中的某个地方。
在这种情况下,您想将它添加到所有对象。我认为假设您没有对所有这些的引用是合理的。所以唯一的方法是在原型(prototype)链中添加属性。
例如,您可以将属性添加到 Array.prototype
、Function.prototype
、...
但是,这不会影响不从它们继承的对象。特别是,创建对象的常用方法是使用对象初始值设定项:{}
。这些对象仅继承自 Object.prototype
。
因此,对于那些人,Object.prototype
是您唯一的选择。
但是,这还不够。可以创建不从 Object.prototype
继承的对象。例如 Object.create(null)
。
所以不,这不可能。在我看来,这是一件好事,因为您不应该污染不属于您的元素。
关于javascript - 有没有办法在不修改 Object.prototype 的情况下给所有 Object 一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31995310/
我是一名优秀的程序员,十分优秀!