有没有办法给所有的对象一个方法而不修改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.prototypeFunction.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?

    下一篇: Extending native JavaScript objects with Object.create