改变功能

时间:2015-01-22 21:01:48

标签: javascript function

我已准备好这样的代码 我无法更改功能Foo(),因为它的别名框架。

  function Foo(){
    this.prop = {
      width: 200
    }
    this.do = function(s1,s2){
      alert(s1+s2);
    }
  }

我需要更改执行功能。

函数Foo()之后和 var foo1 = new Foo()之前; foo1.do(1,0); 我试着写

Foo.do = function(){
  alert('changed');            
}

我无法更改执行功能。我使用了defineProperty甚至构造函数)我没有原型。

完整不正确的演示代码

function Foo(){
        this.prop = {
          width: 200
        }
        this.do = function(s1,s2){
          alert(s1+s2);
        }
}

      Foo.do = function(){
        alert('changed');
      }

      var foo1 = new Foo();
      foo1.do(1,0);
      var foo2 = new Foo();
      foo2.do(1,1);
      var foo3 = new Foo();
      foo3.do(1,2);

我可以为foo1,foo2等更改它。我需要时间。

2 个答案:

答案 0 :(得分:1)

我建议你创建一个实现Foo的构造函数。

function Foo() {
    this.prop = {
        width: 200
    }
    this.do = function (s1, s2) {
        console.log(s1 + s2);
    }
}
Foo.prototype.someMethod = function () {};

// can't change any of the above..

function MyFoo() {
    Foo.call(this);
    this.oldDo = this.do;
    this.do = function (s1, s2, s3) {
        // do something else!
        console.log(s1 + s2 + s3);
    }
}
MyFoo.prototype = Object.create(Foo.prototype);

// tests...
var foo = new Foo();
foo.do(2, 2, 2); // 4
console.log(foo.prop.width); // 200
var myFoo = new MyFoo();
myFoo.do(2, 2, 2); //6
console.log(myFoo.prop.width); // 200

您的新构造函数只需要覆盖您想要更改的方法,其余的将保持不变,原始版本不会更改。注意MyFoo的实例也有一个.prop属性,即使这是在Foo的构造函数中完成的,而不是MyFoo。

答案 1 :(得分:0)

newDo = function(){}; // your new do function    
var foo1 = new Foo()'
foo1.do = newDo;
foo1.do(1,0)

等等。如果您无法更改Foo功能,并且您不能将自己限制为ES6或Firefox(他们有办法修改原型),那么最好的选择是在创建一个后覆盖do new Foo

这也是插入学习模块模式的好点,以便您可以创建自己的嵌套版本的东西:

function Foo() {}; //your original foo
(function() {
  function Foo() {}; //your new foo with a new do method
  // do stuff with the modified do here
})()