我已准备好这样的代码 我无法更改功能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等更改它。我需要时间。
答案 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
})()