Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript私有函数和object.prototype扩展_Javascript_Angularjs_Prototype_Extend - Fatal编程技术网

Javascript私有函数和object.prototype扩展

Javascript私有函数和object.prototype扩展,javascript,angularjs,prototype,extend,Javascript,Angularjs,Prototype,Extend,我有以下angularJS服务 define(["angular"], function(Angular) { var dataStorageService = function() { var serviceConstructor = function() { var _getColor = function(color) { return this.config.categoryColorMapping.colors[color];

我有以下angularJS服务

define(["angular"], function(Angular) {

var dataStorageService = function() {
    var serviceConstructor = function() {
        var _getColor = function(color) {
            return this.config.categoryColorMapping.colors[color];
        }
    }

    var serviceInstance = new serviceConstructor();

    angular.extend(serviceInstance.prototype, {
        config: {
            numberOfMessagesDisplayed: 5,
            maxTitleLength: 48,
            maxPreambleLength: 140,
            categoryColorMapping: {
                colors : {
                    nyheter: '#2B2B2B',
                    sport: '#F59331',
                    underholding: '#F9B00D'
                },
                categories: {
                    nyheter: _getColor('nyheter'),
                    sport: _getColor('sport'),
                    underholding: _getColor('underholding')
                }
            }
        },
        get: function(param) {
            if(this.config.hasOwnProperty(param)) {
                return this.config[param];
            } else {
                console.warn('Playlist::configService:no "' + param + '" config found');
                return false;
            }
        },
        set: function(param, value) {
            this.config[param] = value;
        }
    });

    return serviceInstance;
};

return dataStorageService;
});
现在我的目标是公开以下方法:

  • 得到
  • 设置
  • 我需要私有的“_getColor”方法,但我想在JSON对象配置中使用它。当我运行代码时,我有

    “引用错误:\未定义getColor”


    这样做有可能吗?(要在angular.extend内的JSON对象中使用_GetColorPrivate?

    添加到
    原型的函数在构造函数的词法范围之外定义,因此无法访问“private”方法


    前者在所有实例之间共享,后者在每个实例之间共享。解决此问题的唯一方法是将(每个实例)函数显式导出为实例的属性,使其非私有。

    服务构造函数的定义中
    的定义后添加以下行

    serviceConstructor.prototype._getColor = _getColor ;
    

    函数可以共享,但仍然是私有的,但必须在构造函数中定义特定于实例的私有成员。由于您的私有函数不需要访问特定于实例的私有成员,因此您可以执行以下操作:

    define(["angular"], function(Angular) {
    
    var dataStorageService = function() {
        var serviceConstructor = function() {
        }
    
        var serviceInstance = new serviceConstructor();
        //IIFE returning object that will have private members as closure
        // privileged methods have to be in the same function body as the
        // private fucnction
        serviceInstance.prototype = (function() {
            var _getColor = function(instance, color) {
                return instance.config.categoryColorMapping.colors[color];
            };
            return {
              constructor: serviceConstructor
              ,config: {
                numberOfMessagesDisplayed: 5,
                maxTitleLength: 48,
                maxPreambleLength: 140,
                categoryColorMapping: {
                    colors : {
                        nyheter: '#2B2B2B',
                        sport: '#F59331',
                        underholding: '#F9B00D'
                    },
                    categories: {
                        //since categories is a sub object of serviceinstance.categorycolormapper
                        // it is not possible to get the instance of serviceinstance
                        // at this time unless you set it in the constructor
                        // solution could be that each serviceinstance has it's own categorycolormaper
                        // and when categorycolormapper is created pass the serviceinstance instance
                        nyheter: _getColor(this,'nyheter'),
                        sport: _getColor(this, 'sport'),
                        underholding: _getColor(this, 'underholding')
                    }
                }
              },
              get: function(param) {
                if(this.config.hasOwnProperty(param)) {
                    return this.config[param];
                } else {
                    console.warn('Playlist::configService:no "' + param + '" config found');
                    return false;
                }
              },
              set: function(param, value) {
                this.config[param] = value;
              }
            }
        }());
    
        return serviceInstance;
    };
    
    return dataStorageService;
    });
    

    有关构造函数和原型的更多信息,请参见此处:

    每次创建新实例时,每个实例都将引用该特定实例的函数版本,并且该函数只能访问该实例的其他私有变量和方法。使用dataStorageService中声明的任何引用变量作为通道来获取_getColor的可用性//数据存储服务。。。var internal={};//。。。在构造函数内部。\u getColor=\u getColor;当您将原型设置为on IIFE的返回值时,可以添加私有方法。方法不是特定于实例的,因此它是可能的。特定于实例的成员需要在构造函数中定义,所有需要访问它们的特权方法也是如此。还有其他模式可以模拟,例如: