Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 MooTools 1.3+中的私有财产;班级_Javascript_Oop_Mootools_Private Members - Fatal编程技术网

Javascript MooTools 1.3+中的私有财产;班级

Javascript MooTools 1.3+中的私有财产;班级,javascript,oop,mootools,private-members,Javascript,Oop,Mootools,Private Members,过去几天我一直在研究一种在MooTools类中拥有私有或受保护属性的方法。各种文章(如Sean McArthur的)为不推荐使用的MooTools版本提供了一种方法,但我还没有找到MooTools 1.3+的工作方法 今天,在玩了几个小时的代码之后,我认为我已经创建了一个合适的解决方案。我说“思考”,因为我作为一个程序员真的没有那么丰富的经验。我希望这里的社区能够检查我的代码,告诉我这是不是一个有效的解决方案,或者是一个黑客工作模拟 var TestObj = (function() { v

过去几天我一直在研究一种在MooTools类中拥有私有或受保护属性的方法。各种文章(如Sean McArthur的)为不推荐使用的MooTools版本提供了一种方法,但我还没有找到MooTools 1.3+的工作方法

今天,在玩了几个小时的代码之后,我认为我已经创建了一个合适的解决方案。我说“思考”,因为我作为一个程序员真的没有那么丰富的经验。我希望这里的社区能够检查我的代码,告诉我这是不是一个有效的解决方案,或者是一个黑客工作模拟

var TestObj = (function() {

 var _privateStaticFunction = function() { }

 return new Class({

  /* closure */
  _privates: (function() {

   return function(key, val) {

    if (typeof(this._data) == 'undefined') this._data = {};

    /* if no key specified, return */
    if (typeof(key) == 'undefined') return;

    /* if no value specified, return _data[key] */
    else if (typeof(val) == 'undefined') {
      if (typeof(this._data[key]) != 'undefined') return this._data[key];
      else return;
    }

    /* if second argument, set _data[key] = value */
    else this._data[key] = val;

   }

  /* tell mootools to hide function */
  })().protect(),

  initialize: function() {},

  get: function(val) { return this._privates(val); },
  set: function(key,val) { this._privates(key,val); }

 })

})();


obj1 = new TestObj();
obj2 = new TestObj();

obj1.set('theseShoes','rule');
obj2.set('theseShoes','suck');

obj1.get('theseShoes') // rule
obj2.get('theseShoes') // suck
obj1._privates('theseShoes') // Error: The method "_privates" cannot be called
obj1._privates._data // undefined
obj1._privates.$constructor._data // undefined
我真的很感激任何提示!谢谢大家


编辑:嗯,这很尴尬。我忘了检查明显的obj1.\u数据。我没想到这个会引用实例对象!所以,我很烂。不过,任何想法都会很棒

嘿。在您的情况下,一个更简单的模式就可以了

考虑一个闭包后面的var——非常难以刺穿。它可以通过getter和setter获得

缺点:数据值不能在实例中,或者可以直接访问

var testObj = (function() {
    var data = {__proto__:null}; // 100% private

    return new Class({
        get: function(key) {
            return data[this.uid][key] || null;
        },
        set: function(key, value) {
            data[this.uid][key] = value;
        },
        remove: function(key) {
            delete data[this.uid][key];
        },
        otherMethod: function() {
            alert(this.get("foo"));
        },
        initialize: function() {
            this.uid = String.uniqueID();
            data[this.uid] = {};
        }
    });
})(); // why exec it?


var foo = new testObj();
var bar = new testObj();

foo.set("bar", "banana");
console.log(foo.get("bar")); // banana!
console.log(bar.get("bar")); // undefined.
bar.set("bar", "apple");
console.info(foo.get("bar"), bar.get("bar")); // banana apple
在行动中:

我正在努力找到一种方法来刺穿这种模式——这有时可以通过原型设计来实现

事实上,我玩过一些,下面是固定模式,没有名称空间:

编辑为什么

我对mootools的依赖意味着我对原生js原型的理解还有待改进,因为它使您不得不直接处理这个问题,但是

在模式一中,您定义并运行函数,该函数创建原型并将
数据设置为单个实例。然后使用已设置了
数据的“实时”原型创建新函数

在模式2中,为每个实例创建和引用一个全新的原型,彼此独立。您的函数返回一个带有原型类的新函数。。。所以真正的
新类({})new()
将创建并实例化该类

为了更好地理解这一点,也许您可以先这样编写—这是一种足够常见的模式,用于创建和实例化不被重用的类—这将更有意义:

new (new Class({
    initialize: function() {
        alert("hi");
    }
}))();
反过来可以这样写(如果保存到变量中):


我希望这是有道理的,我不是最好的解释

您不想让getter和setter调用与字典交互的私有函数吗?i、 e.
get:function(val){return getFunc(val)}
Ah,这是我的第一次尝试,但在您的示例中,数据是静态的,我需要每个testobjn实例的数据是唯一的。无需担心,您可以通过在构造函数上为每个实例命名对象存储本身,或者使用模式#2-自行选择。谢谢!!!后一种模式非常适合我。如果您有时间,我希望您能帮助我更好地理解您的方法。您的闭包有点不同,而不是
}()在函数定义的末尾,您有
})并声明
新建testObj()为什么这个“实例化”
var数据
而不是创建私有静态变量?另外,有没有办法在这个闭包中创建一个私有的静态函数,或者像
data
这样的函数会存在于每个
testObj
实例的内存中呢?还有,更优雅的方法:以及变异子现在是如何工作的:完美!再次感谢你的帮助。
new (new Class({
    initialize: function() {
        alert("hi");
    }
}))();
var foo = new Class({
    initialize: function() {
        alert("hi");
    }
});

new foo();