流水255 2014-12-24 07:06 采纳率: 0%
浏览 1532

js中的prototype使用的问题

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,这是怎么回事???

  • 写回答

1条回答 默认 最新

  • Go 旅城通票 2014-12-26 02:52
    关注

    Base.prototype.elements设置prototype原型,所有new出来的类都会有elements属性,并且会继承其他实例修改后的值,是共享的

    this.elements = [];这样写是动态给实例添加elements对象,只属于此实例,不共享。

    $().getId('box').css('color','red');
    alert($().getTagName('p').elements.length);
    用prototype时,你的第一行添加了一个元素,第二行继续添加3个,因为是共享的,所以你2个实例的elements都是一样的有4个

    不用prototype时,是独立的,没构造一次就将elements清空了。所以第一句的添加的对象没有增加到第二句的示例中。你的代码写成这样还好理解点

         var a = $();
        a.getId('box'); //.css('color', 'red');
        var b = $();
        b.getTagName('p');
        alert(b.elements.length);
    
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?