__defineGetter__和__defineSetter__是 Firefox 支持的2个方法,他们可以为对象增加额外的属性,来访问和加工对象的成员属性值。
首先__defineGetter__方法可以为调用他的对象追加一个属性,属性的名称就是该方法的第一个参数,__defineGetter__的第二个参数为一个函数他的返回值决定了这个getter属性的值,通常返回值为对象的某一成属性员的值,或者根据对象的一个或多个成员属性值计算得来的结果,你也可以返回你定义其他和对象成员无关的数值。不过实际情况中前2种的情况要多一些。
HTMLElement.prototype.__defineGetter__("tagname", function()
{
return this.tagName
});
<div id="s"></div>
document.getElementById("s").tagname; // output DIV
而__defineSetter__则定义了一个属性,通过改变这个属性的值可以改变相关对象成员的属性值。和__defineGetter__一样__defineSetter__方法也有2个参数,第一个为属性的名称,第二个参数定义了为相关成员赋值的方法。当把一个值赋给对象的这个setter属性时等号右侧的值会作为参数传入赋值的函数参与对对象成员的赋值。
Array.prototype.__defineSetter__('setlLen', function(x)
{
this.length = x;
});
var arr = [1,2,3,4,5];
arr.setlLen = 2;
alert(foo); // output 1,2
开源系统DiscuzX_3.2中的相关代码:
/**
* 计算浏览器型号及版本
*
* @param types 浏览器类型json列表
*/
function browserVersion(types)
{
var other = 1; // 是否是其他浏览器
for (i in types)
{
var ver = types[i] ? types[i] : i;
if (USERAGENT.indexOf(ver) != -1)
{
var re = new RegExp(ver + '(\\/|\\s|:)([\\d\\.]+)', 'ig');
var matches = re.exec(USERAGENT);
var ver = matches != null ? matches[2] : 0;
other = ver !== 0 && ver != 'mozilla' ? 0 : other;
}
else
{
var ver = 0; // 如果版本为0,表示不是当前类型的浏览器
}
eval('BROWSER.' + i + '= ver');
}
BROWSER.other = other;
}
var BROWSER = {};
var USERAGENT = navigator.userAgent.toLowerCase();
browserVersion({
'ie': 'msie',
'firefox': '',
'chrome': '',
'opera': '',
'safari': '',
'mozilla': '',
'webkit': '',
'maxthon': '',
'qq': 'qqbrowser',
'rv': 'rv'
});
if (BROWSER.safari || BROWSER.rv)
{
BROWSER.firefox = true;
}
BROWSER.opera = BROWSER.opera ? opera.version() : 0;
if (BROWSER.firefox && window.HTMLElement)
{
HTMLElement.prototype.__defineGetter__("innerText", function()
{
var anyString = "";
var childS = this.childNodes;
for (var i = 0; i < childS.length; i++)
{
if (childS[i].nodeType == 1)
{
anyString += childS[i].tagName == "BR" ? '\n' : childS[i].innerText;
}
else if (childS[i].nodeType == 3)
{
anyString += childS[i].nodeValue;
}
}
return anyString;
});
HTMLElement.prototype.__defineSetter__("innerText", function(sText)
{
this.textContent = sText;
});
HTMLElement.prototype.__defineSetter__('outerHTML', function(sHTML)
{
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var df = r.createContextualFragment(sHTML);
this.parentNode.replaceChild(df, this);
return sHTML;
});
HTMLElement.prototype.__defineGetter__('outerHTML', function()
{
var attr;
var attrs = this.attributes;
var str = '<' + this.tagName.toLowerCase();
for (var i = 0; i < attrs.length; i++)
{
attr = attrs[i];
if (attr.specified)
{
str += ' ' + attr.name + '="' + attr.value + '"';
}
}
if (!this.canHaveChildren)
{
return str + '>';
}
return str + '>' + this.innerHTML + '</' + this.tagName.toLowerCase() + '>';
});
HTMLElement.prototype.__defineGetter__('canHaveChildren', function()
{
switch (this.tagName.toLowerCase())
{
case 'area':
case 'base':
case 'basefont':
case 'col':
case 'frame':
case 'hr':
case 'img':
case 'br':
case 'input':
case 'isindex':
case 'link':
case 'meta':
case 'param':
return false;
}
return true;
});
}
参考:
http://www.cnblogs.com/silence516/archive/2008/12/14/1355021.html
http://blog.163.com/service80@126/blog/static/16193603020103982754136/