javascript – MooTools 1.3类中的私有属性

我花了最近几天研究了一种在MooTools类中拥有私有或受保护属性方法.各种文章(即Sean McArthur的Getting Private Variables in a MooTools Class)为MooTools的弃用版本提供了一种方法,但我无法找到MooTools 1.3的工作方法.

今天,在玩了几个小时的代码后,我想我已经创建了一个合适的解决方案.我说“思考”,因为我真的不是一个经验丰富的程序员.我希望这里的社区可以查看我的代码并告诉我它是否真的是一个有效的解决方案,或者是hackjob仿真.

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._data.我不认为这会引用实例对象!所以,我很糟糕.不过,任何想法都会很棒!

最佳答案
嘿嘿.在你的情况下,一个更简单的模式将成功.

考虑一个闭包后面的var – 极难刺穿.它可以通过getter和setter获得.

缺点:数据值不能在实例中,也不能直接访问.

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

    return new Class({
        get: function(key) {
            return data[this.uid][key] || null;
        },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

在行动:http://jsfiddle.net/dimitar/dCqR7/1/

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

事实上,我玩了一些,这里是没有命名空间的固定模式:

http://jsfiddle.net/dimitar/dCqR7/2/

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

    return new Class({
        get: function(key) {
            return data[key] || null;
        },value) {
            data[key] = value;
        },remove: function(key) {
            delete data[key];
        },otherMethod: function() {
            alert(this.get("foo"));
        }
    });
});


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

foo.set("bar",bar.get("bar")); // banana apple

编辑为什么…

我对mootools的依赖意味着我对原生js原型的理解留下了一些需要的东西,因为它抽象你必须直接处理这个但是……

在模式一中,您定义AND运行函数,该函数创建原型并设置数据 – 一个单一的实例.然后,您可以使用已设置数据的“实时”原型创建新功能.

在模式二中,为每个实例创建并引用一个全新的原型,彼此独立.你的函数返回一个带有原型Class的新函数……所以真的是新的Class({});因此新的< var>()将创建并实例化该类.

为了更好地理解这一点,也许你可以先写一下这个 – 一个足够普通的模式来创建和实例化一个没有被重用的类 – 这将更有意义:

new (new Class({
    initialize: function() {
        alert("hi");
    }
}))();

反过来可以这样写(如果保存到变量中):

var foo = new Class({
    initialize: function() {
        alert("hi");
    }
});

new foo();

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)