我可以用javascript覆盖构造函数吗?

我可以用javascript覆盖构造函数吗?,javascript,Javascript,我刚刚了解到我在一个Javascript类中工作,如下所示,但是实际的构造函数呢 如果可能的话,我如何在不实例化类的情况下实现它 var UserModel = (function() { var User; User = function() {}; // <- I want to overwrite this whilst keeping below methods User.prototype.isValid = function() {}; return User;

我刚刚了解到我在一个Javascript类中工作,如下所示,但是实际的构造函数呢

如果可能的话,我如何在不实例化类的情况下实现它

var UserModel = (function() {
  var User;
  User = function() {}; // <- I want to overwrite this whilst keeping below methods
  User.prototype.isValid = function() {};
  return User;
})();
var UserModel=(函数(){
var用户;

User=function(){};//只需暂时保存
prototype
对象,然后替换构造函数:

var proto = UserModel.prototype;
UserModel = function () { /* new implementation */ };
UserModel.prototype = proto;

基本上,创建一个不做任何事情的临时函数,将其原型设置为父类的原型,然后可以将基类用作父类,而无需调用其构造函数

如果需要从子类的构造函数引用父类的构造函数,只需使用
Function.prototype.apply
转发构造函数调用即可

Javascript继承模型:

// Base class

var Base = function ( ) {
    this.foo = 40;
};

Base.prototype.bar = function ( ) {
    return this.foo;
};

// Inherited class

var Child = function ( ) {
    Base.apply( this, arguments );
    this.foo += 2;
};

var F = function ( ) { };
F.prototype = Base.prototype;
Child.prototype = new F( );

太干净了!谢谢!请注意,如果您没有访问作用域的权限,您将无法覆盖构造函数。用例是什么?@MaëlNison我认为OP希望随后覆盖构造函数。@MaëlNison出于测试目的能够注入间谍以捕获验证参数为什么要执行Child.prototype=newF();而不是Child.prototype=Base.prototype;?@Naor,因为如果您只是将原型设置为父对象的原型,那么如果您向子对象的原型添加新方法,它们也将添加到父对象。如果您覆盖子对象原型中的父对象方法,它们也将在父对象中被替换(因为它们是同一个对象)。使用
new
的意义在于,它将创建一个新的实例,该实例可以在不改变原始原型的情况下进行编辑。