在构造函数之后运行其他操作
Run additional action after constructor
是否可以更改构造函数,以便在创建对象后运行一些额外的操作。我尝试了类似的东西:
var origFoo = Foo
Foo = function() {
origFoo.apply(this, arguments);
/* extra actions */
}
Foo.prototype = new origFoo();
但这有几个问题,例如构造函数运行两次或更改原型链。
你离得很近。您应该将Foo.prototype
分配给origFoo.prototype
,以便获得相同的原型链。其他一切都很好!
例:
var Foo = function () {
console.log('OriginalFoo');
};
Foo.prototype.method1 = function () {
console.log('Method1');
};
OriginalFoo = Foo;
Foo = function () {
OriginalFoo.apply(this, arguments);
console.log('NewFoo');
};
Foo.prototype = OriginalFoo.prototype;
Foo.prototype.method2 = function () {
console.log('Method2');
};
var x = new Foo();
x.method1();
x.method2();
演示:http://jsbin.com/ibatah/1/edit?js,console,output
PS:仍然存在类似静电属性(Foo.prop)的问题,但恐怕除了一次复制一个之外,我没有其他解决方案。
编辑:特殊构造函数的解决方案。
确实有一些构造函数不喜欢被称为函数,例如:Image
。要克服它,您可以在下面执行更笨拙的解决方案。您可以利用这样一个事实,即您可以从构造函数返回一个对象,它取代了使用 new 创建的对象。在被覆盖的构造函数中,调用方法时必须始终使用此新对象,而不是this
。
var Foo = function(a,b,c) {
console.log('OriginalFoo',a,b,c);
};
Foo.prototype.prop1 = 'Property1';
Foo.prototype.method1 = function() {
console.log('Method1', this.prop1);
};
OriginalFoo = Foo;
Foo = function(a,b,c) {
var obj = new OriginalFoo(a,b,c);
obj.init('Changed...'); // or this.init.call(obj,'Changed!');
this.init('Not Changed'); // applies to a discarded object, has no effect
console.log('NewFoo');
return obj;
};
Foo.prototype = OriginalFoo.prototype;
Foo.prototype.prop2 = 'Property2';
Foo.prototype.method2 = function() {
console.log('Method2', this.prop2);
};
Foo.prototype.init = function(param) {
this.prop2 = param;
};
var x = new Foo('1','2','3');
console.log(x.prop1);
console.log(x.prop2);
x.method1();
x.method2();
演示:http://jsbin.com/ibatah/2/edit?js,console,output
相关文章:
- Jquery未定义函数正在停止其他操作
- jQuery:暂停按钮可以暂停所有其他操作
- 安排工作在触发其他操作后进行
- 如果条件,则在其他操作之后调用 Redux 操作
- 如果匹配,则对数组中的每个项执行其他操作,如果使用jvectormaps
- 在构造函数之后运行其他操作
- imacros javascript,如果其他操作不正常的话
- Node.js:执行多个异步操作的最佳方式,然后执行其他操作
- 是否可以在HTML/JS中执行其他操作的同时锚定页面
- Javascript函数阻止Safari执行任何其他操作
- 修改checkbox change()事件以等待其他操作
- jquery如果按钮点击了执行其他操作执行其他操作
- 鼠标悬停时执行,鼠标悬停时执行其他操作
- 执行3个返回true/false的函数,如果所有函数都返回true,则执行其他操作,没有短路
- 检查json数组与我的值做操作,否则其他操作
- 使用JQuery,在执行其他操作之前检查属性是否存在
- 如果index为0(在for循环中i === 0),则执行某些操作,否则执行其他操作.不考虑else情况
- Jquery或Javascript跟踪事件和其他操作
- 在加载php页面时,会弹出js确认框,如果用户提交,我必须在php中执行sg,如果用户取消,我必须执行php中的其他操作
- 显示javascript警报和执行其他操作