JS类封装属性办法

ywq0127 2014-03-21 05:23:10
由于在另一个我发的帖子回不了,所以重新开了一个,原帖 http://bbs.csdn.net/topics/390736204
感谢在那个帖子里面热心帮助的每位同学
原帖#14给了一种比较好的方法实现JS类的类似私有属性:http://bbs.csdn.net/topics/390736204#post-396986445

开这个贴是为了给出一个我基于#14写的一个:

(function(){
var data;
function test() {
this.index = uniqid(); // 这里这样主要是为了防止推导出其他对象的index值
}
test.prototype ={
get : function() {
return data[this.index];
},
set : function(val) {
data[this.index] = val;
return this;
},
getData: function(){ // 实际时候要去掉这个
return data;
}
}
/**
* 基于当前时间生成唯一ID(网上找的)
* @param {Object} prefix 前缀
* @param {Object} more_entropy true时增加额外的使更具唯一性
*/
function uniqid(prefix, more_entropy) {
// discuss at: http://phpjs.org/functions/uniqid/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// revised by: Kankrelune (http://www.webfaktory.info/)
// note: Uses an internal counter (in php_js global) to avoid collision
// test: skip
// example 1: uniqid();
// returns 1: 'a30285b160c14'
// example 2: uniqid('foo');
// returns 2: 'fooa30285b1cd361'
// example 3: uniqid('bar', true);
// returns 3: 'bara20285b23dfd1.31879087'

if (typeof prefix === 'undefined') {
prefix = '';
}

var retId;
var formatSeed = function(seed, reqWidth) {
seed = parseInt(seed, 10).toString(16); // to hex str
if (reqWidth < seed.length) { // so long we split
return seed.slice(seed.length - reqWidth);
}
if (reqWidth > seed.length) { // so short we pad
return Array(1 + (reqWidth - seed.length)).join('0') + seed;
}
return seed;
};

// BEGIN REDUNDANT
if (!this.php_js) {
this.php_js = {};
}
// END REDUNDANT
if (!this.php_js.uniqidSeed) { // init seed with big random int
this.php_js.uniqidSeed = Math.floor(Math.random() * 0x75bcd15);
}
this.php_js.uniqidSeed++;

retId = prefix; // start with prefix, add current milliseconds hex string
retId += formatSeed(parseInt(new Date().getTime() / 1000, 10), 8);
retId += formatSeed(this.php_js.uniqidSeed, 5); // add seed hex string
if (more_entropy) {
// for more entropy we add a float lower to 10
retId += (Math.random() * 10).toFixed(8).toString();
}
return retId;
}

window.test = test;
})();

测试代码:

var obj1 = new test();
obj1.set("1234");
console.log(obj1.get());
obj1.set("fasdfa");
console.log(obj1.get());
console.log(obj1.getData());

var obj2 = new test();
obj2.set("00000");
console.log(obj2.get());
obj2.set("ddddd");
console.log(obj2.get());
console.log(obj2.getData());
...全文
142 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧