js中的prototype使用的问题????
new
base.js
var $ = function ()
{
return new Base();
}
//创建一个数组,来保存获取的节点和节点数组*****************
function Base() {}
Base.prototype.elements = [];
//创建一个数组,来保存获取的节点和节点数组****************
function Base()
{
this.elements = [];
}
//获取ID节点
Base.prototype.getId = function (id) {
this.elements.push(document.getElementById(id));
return this;
};
//获取元素节点
Base.prototype.getTagName = function (tag) {
var tags = document.getElementsByTagName(tag);
for (var i = 0; i < tags.length; i ++) {
this.elements.push(tags[i]);
}
return this;
};
以上****号处这两种写法有什么不同,为什么测试获取的数组的值不一样
html代码
box
段落
段落
段落
demo.js
window.onload = function ()
{
$().getId('box').css('color','red');
alert($().getTagName('p').elements.length);
};
结果:把数组定义在函数体内(*处位置的不同)得到是3,而通过prototype方式,获得数组的长度确实4,这是怎么回事??? 展开
我没有去测试代码,但是我可以解释下这2种情况
第一种情况
//创建一个数组,来保存获取的节点和节点数组*****************
function Base()
{
this.elements = [];
}这里的elements是属于各自的对象的,也就是通过new 出的对象,由于你的写法返回的是一个new Base()的对象,因此$()这个操作实际上是返回的一个Base对象,
然后 你在window.onload中写了2个语句,如下
$().getId('box').css('color','red'); (这里的$()和下面一句的$()是2个不同的对象,虽然看起来一样,但是他们拥有自己的elements属性,因此此语句的这个$().elements 是1,而下面那个$()的对象是3,也就是3个P标签)
alert($().getTagName('p').elements.length);这里的$()是一个新对象,返回3个P第二种情况
function Base() {}
Base.prototype.elements = [];放在prototype中的属性,是所有对象共享的,因此下面2句访问的是共享的elements
$().getId('box').css('color','red');
alert($().getTagName('p').elements.length);第一句往共享的原型链对象elements放了一个box,第二句往共享的原型链对象elements放了3个p,所以elements总共是4个元素,不管你创建多少$(),都指向同一个!