覆盖JavaScript函数中的属性

时间:2015-11-16 08:45:24

标签: javascript web

我想覆盖构造函数中的成员函数而不是整个构造函数但只有一个成员函数,我的构造函数看起来像

function viewModel(){
  var self= this;
  self = {
          testFuncA:function(){
            console.log("you are in not overrided function test FuncA");
          },
          testFuncB:function(){
            console.log("you are in not orverided function test FuncB");
          }
      };
  }

并且在override.js我希望像这样覆盖它

viewModel.prototype.testFuncA = function(){
      console.log("you are in overrided function test funcA");  
 }

当我创建viewModel构造函数

的对象时
var obj = new viewModel();
obj.testFuncA();

然后输出应该是你在覆盖功能测试funcA ,但它打印你没有超越功能测试FuncA 这不是我的欲望输出我怎么可能实现欲望输出。

当我的网页中只加载core.js文件时,testFuncA将输出为您没有覆盖功能测试FuncA ,但是当我加载这两个文件时,是core.js,之后override.js然后testFuncA将输出您处于覆盖功能测试功能

3 个答案:

答案 0 :(得分:2)

首先,我们不能改变这个构造函数的内部工作原理,你只能用原型来做那种事情,所以你需要在命名空间中完全覆盖它。在override.js中,只需使用相同的代码:

function viewModel(){
    this.testFuncA = function(){
        console.log("This is an overrided function test FuncA");
    };
    this.testFuncB = function(){
        console.log("This is an function test FuncB");
    };
}

因此,这将取代您在命名空间中的原始功能,最终实现您的目标。如果你一直在使用从现有对象复制的原型系统,你只需要按照Proto.testFuncA = function(){...}

的方式做一些事情。

注意:我更改了代码作为如何处理构造函数的建议,因为构造函数已经通过'this'传递了一个新对象,而不需要再创建另一个。您还将'Self'作为对'this'的引用,但是通过创建一个新对象,您实际上只将Self中的引用更改为新对象,您实际上并没有以任何方式更改它。相反,你改变了'Self'指向的新对象。

注2:所以如果你想使用原型。为了更好地理解原型,我会通读这个Why is it necessary to set the prototype constructor?。这也是http://www.w3schools.com/js/js_object_prototypes.asp

答案 1 :(得分:1)

在core.js中,如果你有类似的东西

      function viewModel(){
      }
      viewModel.prototype.testFuncA = function(){
        console.log("you are in not overrided function test FuncA");
      };
      viewModel.prototype.testFuncB = function(){
        console.log("you are in not orverided function test FuncB");
      };

然后在override.js中,您可以像这样使用soem这样的

      viewModel.prototype.testFuncA = function(){
            console.log("you are in overrided function test funcA");  
       }

已编辑: - 如果您不想在core.js中进行更改

var viewModelParent = viewModel;
var myViewModel = new viewModelParent();

var viewModel = function(){
    this.testFuncA = function(){
            console.log("you are in overrided function test funcA");  
    }
};
viewModel.prototype = myViewModel;

答案 2 :(得分:0)

core.js可以做一些改变,比如

function viewModel(){

}
viewModel.prototype = {
      testFuncA:function(){
        console.log("you are in not overrided function test FuncA");
      },
      testFuncB:function(){
        console.log("you are in not orverided function test FuncB");
      }
}
override.js中的

使用下面的代码

viewModel.prototype.testFuncA=function(){
     //TODO::
}

U应该在override.js

之前确认core.js加载