问题是这段代码有错~~~要搞清楚this在什么情况下是指向什么对象~~~this.length = { 
valueOf:function(){ 
return this.toolbarIcons.length;            //问题1 

} 这里this是指向valueOf对象而不是它的父对象~~~而valueOf对象是没有toolbarIcons子对象的,所以报错~~
问题2:不可能做到.

解决方案 »

  1.   

    To:he_8134
    有什么方法指向 Toolbar对象?
      

  2.   

    this.length = function(){  
    return this.toolbarIcons.length;
    }这样写不是简单直接吗?
    上面那个说错了~~上面那个this是指向了length对象,总之也不是指向Toolbar
    this.length = {  
    valueOf:function(){  
    return this.toolbarIcons.length;            //问题1  
    }  
    }  
      

  3.   

    TO:he_8134问题是这段代码有错~~~要搞清楚this在什么情况下是指向什么对象~~~this.length = { 
    valueOf:function(){ 
    return this.toolbarIcons.length;            //问题1 

    } 这里this是指向valueOf对象而不是它的父对象~~~而valueOf对象是没有toolbarIcons子对象的,所以报错~~ 
    ========>
    这里的this不是指向valueOf对象,看一下语法:
    this.length = {}
    这里,{} 声明了一个无类型的对象,用this.length来引用。在this.length中,又有一个方法:valueOf,里面用到this,在javascript中,对this的定义,有这样一句话:this指向当前正在运行的函数(方法)的对象。这里,正在运行的函数是:valueOf,而这个函数是由this.length来引用,所有这里的this指的是this.length,而不是valueOf方法。显然,在this.length所引用的无类型对象中,并没有对toolbarIcons的定义,就报错了。解决这个问题,使用一个局部变量就可以了 function Toolbar()
    {
    this.toolbarIcons = [];

    this.add = function(toolbarIcon)
    {
    this.toolbarIcons.push(toolbarIcon);
    }

    //定义一个局部变量
    var __self = this;

    this.length = 
    {
    valueOf : function()
    {
    //return this.toolbarIcons.length;            //问题1
    return __self.toolbarIcons.length;
    }
    }

    this.get  = function(index)
    {
    return this.toolbarIcons[index];
    }
    } 关于第二个问题:
    javascript中对对象的定义是这样的:属性的无序集合。toolbar[1]可以认为是toolbar.1,显然在toolbar中没有对toolbar.1的定义,但可以这样使用方法来实现类似的效果。
    最后想说的是:楼主这样定义类,是不推荐使用的方法。建议把一些类共用的部分使用prototype来添加,而私有的部分可以在类的构造函数中用this关键字来添加
    如: function Toolbar()
    {
    this.toolbarIcons = [];

    //其他私有的成员
    }

    Toolbar.prototype.add = function(toolbarIcon)
    {
    this.toolbarIcons.push(toolbarIcon);
    }

    //...其他共用的成员
      

  4.   


    <script type="text/javascript">
    Object.extend = function (a, b) {
    //追加方法
        for (var i in b) a[i] = b[i];
        return a;
    };var Toolbar = function () {
    var wc = this;
    wc.toolbarIcons = [];
    return Object.extend(wc.toolbarIcons, wc);
    };Toolbar.prototype.add = function (toolbarIcon) {
    var wc = this;
    wc.toolbarIcons.push(toolbarIcon);
    };var wc = new Toolbar;
    wc.add(0);
    wc[1] = 2;
    alert(wc.length);
    </script>
    length属性是数字读写的,覆盖不了啊还想实现其他的功能建议用其他的关键字,反正这样的话可以绑定关系,实现索引器
      

  5.   

    开始想用对象来模拟数组,后来发现模拟的话。。
    wc[1] = 2;
    这样就改变不了length了,所以。。还是用array来实现索引器的效果吧至于具体方法LZ具体扩展去好了
    郁闷,结了帖子了。偶研究了这么长时间
    要是没人看偶就闷了
      

  6.   

    哈哈,跟楼上一样很郁闷~~~我还是不明白为什么要这样写,这样取长度不是还得obj.length.valueOf()吗?有必要这样搞吗?
            this.length = 
            {
                valueOf : function()
                {
                    //return this.toolbarIcons.length;            //问题1
                    return __self.toolbarIcons.length;
                }
            }
      

  7.   

    valueOf
    是当有+,-,*,/等运算时候,默认调用
    toString则是转换为字符串时候,还有类型转换的时候
    可以参考这个月の影 17:02:35
    <script language=JavaScript>
    Object.prototype.length = {
    valueOf: function () {
    return this.len()+2;
    },
    toString: function () {
    return this.len()+1;
    },
    len: function () {
    return 1000;
    }
    };
    var s = {a:1,b:2};
    alert(s.length+1);
    </script>
      

  8.   

    原来是这样~~但是如果漏掉toString的话就会失去部分意义了~~