如何在javascript中覆盖被调用的函数

时间:2016-12-14 08:32:15

标签: javascript

我试过这个没有成功:

<!DOCTYPE html>
<html>
<title>Web Page Design</title>
<head>
<script>
    function MyClass() {
        function someFunc() { calledFunc(); }
        function calledFunc() { document.writeln('orig called'); }
        return {
            someFunc: someFunc,
            calledFunc: calledFunc
        }
    }
    
    var obj = new MyClass();
    obj.someFunc();
    obj.calledFunc = function() { document.writeln("not orig called"); }
    obj.someFunc();
    
</script>
</head>
<body>
</body>
</html>

我发现只调用了orig called而不是not orig called我如何覆盖calledFunc以便调用not orig called

3 个答案:

答案 0 :(得分:2)

您必须在调用this.方法之前添加calledFunc,否则您将引用私有function calledFunc()

<!DOCTYPE html>
<html>
<title>Web Page Design</title>
<head>
<script>
    function MyClass() {
        function someFunc() { this.calledFunc(); }
        function calledFunc() { document.writeln('orig called'); }
        return {
            someFunc: someFunc,
            calledFunc: calledFunc
        }
    }
    
    var obj = new MyClass();
    obj.someFunc();
    obj.calledFunc = function() { document.writeln("not orig called"); }
    obj.someFunc();
    
</script>
</head>
<body>
</body>
</html>

答案 1 :(得分:1)

obj.calledFunc不是您在someFunc内调用的那个。

您正在替换obj.calledFunc引用的内容,但在someFunc中,您正在调用MyClass闭包中定义的内容。

您必须执行以下操作:

function MyClass() {
  var self = this;
  this.calledFunc = function() {
    document.writeln('orig called');
  };
  this.someFunc = function() {
    self.calledFunc(); // This refers to the same function you've exposed
  };
}

var obj = new MyClass();
obj.someFunc();
obj.calledFunc = function() {
  document.writeln("not orig called");
}
obj.someFunc();

答案 2 :(得分:1)

您不应直接在实例化对象中(通过构造函数)定义方法,因为在每个新实例上,您都会在内存中获得新副本。使用JavaScript的原型概念。您可以覆盖对象中的原型方法。它将通过从内部调用obj.myFunction()this.myFunction()来调用。如果在实例中找不到它,它将在原型链中查找。您可以在链中构建多个原型,因此您可以构建继承模型。当您使用Object.defineProperties方法时,您还可以控制属性(方法是否也是可执行属性)是否可写以及其他设置。

您在示例中尝试的内容以及其他一些答案说明,不是覆盖,而是覆盖方法。当覆盖时,原始方法将丢失。

&#13;
&#13;
MyClassPrototype = {};

Object.defineProperties(MyClassPrototype,
{
  'someFunc':
    {
      value: function()
             {
               this.calledFunc();
             }
    },

  'calledFunc':
    {
      value: function()
             {
               document.writeln('orig called<br>\n');
             },
      writable: true
    }

});


function MyClass()
{

}
MyClass.prototype = MyClassPrototype;


var obj = new MyClass();
obj.someFunc();

obj.calledFunc = function()
{
  document.writeln("not orig called AND...");
  // call original method with proper this-context (instantiated object)
  Object.getPrototypeOf(this).calledFunc.call(this);
}
obj.someFunc();
&#13;
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Titel</title>
</head>
<body>
</body>
</html>
&#13;
&#13;
&#13;