覆盖派生函数

时间:2017-01-31 07:25:34

标签: javascript inheritance

我正在尝试查找是否可以覆盖JavaScript中的派生函数。假设我有这样的功能。

function Filter(applyCallback) {
    filterController = this;

    FilterValues = {};
}

Filter.prototype = {
   constructor: Filter,
   Reset: function() {
      FilterValues = {};
   }
}

function SearchFilter(applyCallback) {
   Filter.call(this, applyCallback);
}

SearchFilter.prototype = Object.create(Filter.prototype);

SearchFilter.prototype.constructor = SearchFilter;

/// When doing this I believe i override the entire base.Reset function
SearchFilter.prototype.Reset = function() {
   /// Call Filter.Reset()
   base.Reset();

   /// Do SearchFilter.Reset things
   FilterValues.search= "default search string";
}

如果代码不清楚:我想要实现的是一个上层过滤器控制器,它将包含所有通用逻辑,如reset和apply,并从该过滤器控制器派生,以创建包含逻辑的更具体的过滤器控制器对于所有不同的过滤器类型等我想保留通用过滤器控制器行为。

我能想到的一个解决方案是:

function Filter(applyCallback) {
    filterController = this;

    FilterValues = {};
}

Filter.prototype = {
   constructor: Filter,
   Reset: function() {
      FilterValues = {};

      if(resetFunction !== null)
         resetFunction(); /// Parent calls its unknown children, ugh..
   }
}

function SearchFilter(applyCallback) {
   Filter.call(this, applyCallback);

   resetFunction = function() {
      /// Do SearchFilter.Reset things
      FilterValues.search= "default search string";
   };
}

SearchFilter.prototype = Object.create(Filter.prototype);

SearchFilter.prototype.constructor = SearchFilter;

或者相反:

function Filter(applyCallback) {
    filterController = this;

    FilterValues = {};

    resetFunction = function() {
       FilterValues = {};
    };
}

Filter.prototype = {
   constructor: Filter
}

function SearchFilter(applyCallback) {
   Filter.call(this, applyCallback);
}

SearchFilter.prototype = Object.create(Filter.prototype);

SearchFilter.prototype = { 
   constructor: SearchFilter,
   Reset: function() {
      if(resetFunction !== null)
         resetFunction(); /// Invoke the generics filter reset

      FilterValues.search = "default search string";
   }
}

在我看来,最好的做法是将c#等效于base.Function(),但由于我对JavaScript很新,我不确定这是否可行(我敢打赌不是)。无论如何,有人对此有任何想法吗?什么是最佳实践等等。

提前致谢!

2 个答案:

答案 0 :(得分:1)

通常,您将按名称访问父构造函数的原型:

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ES6的课程让你避免这种重复:

SearchFilter.prototype.Reset = function() {
    /// Call Filter.Reset()
    Filter.prototype.Reset.call(this);

    /// Do SearchFilter.Reset things
    FilterValues.search = "default search string";
};

你可能也不是要让class SearchFilter extends Filter { Reset() { super.Reset(); FilterValues.search = "default search string"; } } 成为全球性的。 FilterValues并非隐含在JavaScript中。

this

请注意,仅使用PascalCase作为构造函数是标准样式,而将camelCase用于其他所有内容。

由于ES6课程也为你设置了function Filter(applyCallback) { this.filterValues = {}; } ,所有这些都是:

constructor

答案 1 :(得分:-1)

您可以使用jQuery的扩展功能:

   public string CommonFileSave(HttpPostedFileBase postedFile, string filePath)       
   {
        string resultResponse = "sccuess";

        if (!Directory.Exists(filePath))
        {
            Directory.CreateDirectory(filePath);
            postedFile.SaveAs(filePath + postedFile.FileName);
        }
        else
        {
            filePath = filePath + postedFile.FileName;
            if (!System.IO.File.Exists(filePath))
            {
                postedFile.SaveAs(filePath);
            }
        }
        return resultResponse;
    }

var object = $.extend({}, object1, object2);

这会将objec2合并到object1