gpt4 book ai didi

javascript - 有没有办法在不修改 Object.prototype 的情况下给所有 Object 一个方法?

转载 作者:行者123 更新时间:2023-11-29 16:56:25 25 4
gpt4 key购买 nike

我想为我的 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.prototypeFunction.prototype、...

但是,这不会影响不从它们继承的对象。特别是,创建对象的常用方法是使用对象初始值设定项:{}。这些对象仅继承自 Object.prototype

因此,对于那些人,Object.prototype 是您唯一的选择

但是,这还不够。可以创建不从 Object.prototype 继承的对象。例如 Object.create(null)

所以不,这不可能。在我看来,这是一件好事,因为您不应该污染不属于您的元素。

关于javascript - 有没有办法在不修改 Object.prototype 的情况下给所有 Object 一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31995310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com