问题是这段代码有错~~~要搞清楚this在什么情况下是指向什么对象~~~this.length = {
valueOf:function(){
return this.toolbarIcons.length; //问题1
}
} 这里this是指向valueOf对象而不是它的父对象~~~而valueOf对象是没有toolbarIcons子对象的,所以报错~~
问题2:不可能做到.
valueOf:function(){
return this.toolbarIcons.length; //问题1
}
} 这里this是指向valueOf对象而不是它的父对象~~~而valueOf对象是没有toolbarIcons子对象的,所以报错~~
问题2:不可能做到.
有什么方法指向 Toolbar对象?
return this.toolbarIcons.length;
}这样写不是简单直接吗?
上面那个说错了~~上面那个this是指向了length对象,总之也不是指向Toolbar
this.length = {
valueOf:function(){
return this.toolbarIcons.length; //问题1
}
}
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);
}
//...其他共用的成员
<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属性是数字读写的,覆盖不了啊还想实现其他的功能建议用其他的关键字,反正这样的话可以绑定关系,实现索引器
wc[1] = 2;
这样就改变不了length了,所以。。还是用array来实现索引器的效果吧至于具体方法LZ具体扩展去好了
郁闷,结了帖子了。偶研究了这么长时间
要是没人看偶就闷了
this.length =
{
valueOf : function()
{
//return this.toolbarIcons.length; //问题1
return __self.toolbarIcons.length;
}
}
是当有+,-,*,/等运算时候,默认调用
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>