【问题标题】:Javascript OOP private functionsJavascript OOP 私有函数
【发布时间】:2016-08-17 04:37:48
【问题描述】:

我想创建一个可以用 json 文件实例化的构造函数,然后由一些私有函数使用,这些私有函数最终将它们的结果传递给原型的公共函数。这是正确的方法吗?

这里更具体的代码:

//constructor
function queryArray(json){
    this.json = json;

    //init qry template with default values
    function qryInit() {
        var qryTemplate = {
            //some stuff
        }
        return qryTemplate;
    }

    //generate array of request templates
    function qryTempArray(json){
        var template = qryInit();
        var qryTempArray1 = [];
        for(var i = 0; i < json.length; i++){
            qryTempArray1.push({
                'SearchIndex': json[i].SearchIndex,
                'Title': json[i].Title,
                'Keywords': json[i].Keywords,
                'MinimumPrice': json[i].MinimumPrice,
                'MaximumPrice': json[i].MaximumPrice,
                'ResponseGroup': template.ResponseGroup,
                'sort': template.sort
            });
        }
        return qryTempArray1;
    }
}

//function for finally building all the queries
queryArray.prototype.qryBuilder = function(){
    var qryTempArray1 = [];
    qryTempArray1 = qryTempArray(this.json);
    //other stuff
}

如果我在对象上调用 qryBuilder 函数,我会收到错误 在 for 循环中 json.length 的函数 qryTempArray 中(未定义)。 为什么会这样?

【问题讨论】:

  • 你是想实现依赖注入还是什么?
  • 您错过了结束大括号。编辑您的代码
  • query 用单个 r 拼写,构造函数名称应大写而实例应小写,缺少右括号,您可以改进缩进,但是除此之外,您的代码很好。
  • 你应该只使用支持 ES6 语法的打字稿。结果仍然是 javascript (ES5)
  • 谢谢你这么久;为什么你推荐使用打字稿?

标签: javascript function oop private


【解决方案1】:

正如上面编写的代码,我很惊讶你甚至进入了循环。当您调用 qryBuilder(); 时,您似乎会变得未定义。 我希望按照以下方式进行操作。

//constructor
function queryArray(json) {
    var self = this;
    self.json = json;

    //init qry template with default values
    self.qryInit = function() {
        var qryTemplate = {
            //some stuff
        }
        return qryTemplate;
    }

    //generate array of request templates
    self.qryTempArray = function(json) {
        var template = self.qryInit();
        var qryTempArray1 = [];
        for (var i = 0; i < json.length; i++) {
            qryTempArray1.push({
                'SearchIndex': json[i].SearchIndex,
                'Title': json[i].Title,
                'Keywords': json[i].Keywords,
                'MinimumPrice': json[i].MinimumPrice,
                'MaximumPrice': json[i].MaximumPrice,
                'ResponseGroup': template.ResponseGroup,
                'sort': template.sort
            });
        }
        return qryTempArray1;
    }
    return self;
}
queryArray.prototype.qryBuilder = function() {
    var qryTempArray1 = [];
    qryTempArray1 = this.qryTempArray(this.json);
    return qryTempArray1;
}
var q = new queryArray([{
    'SearchIndex': 0,
    'Title': 'foo',
    'Keywords': 'testing',
    'MinimumPrice': 20,
    'MaximumPrice': 40
}]);
console.log(q);
console.log(q.qryBuilder());

【讨论】:

  • 我理解正确吗?为了解决这个问题,我需要一个特权函数吗?
  • 从您的原始代码中,我看不出您的原型函数如何能够访问 qryTempArray() 。在原型上定义的函数没有定义在 queryArray 的构造函数范围内,并且无法访问构造函数的本地\私有变量
  • 这正是我错的地方。我认为原型的函数共享构造函数的范围以及私有变量和函数。谢谢!但还有一个问题。如果我以在原型上定义每个函数的方式更改我的代码,那么它可以在没有 this/self 的情况下工作......如果原型函数不共享构造函数的 sope,为什么会这样?
  • 当你创建queryArray的实例时,原型的属性被复制到对象中。原型属性可以简单地使用“this”从另一个隐式访问。 This 是对原型的一个不错的概述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2013-01-29
  • 2012-09-03
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多