js 的一些语法问题,求助

hejunbin 2006-10-06 07:25:42
foo = {
'bar': function () {
alert(this);
},
'toString': function () {
return 'foo';
}
};
foo.bar();//返回的是"foo"
(foo.bar)();//返回的是"[object Window]"
(foo.bar || null)();//返回的是"[object Window]"
bar = foo.bar; bar();//返回的是"[object Window]"

这个是为什么啊,还有如果是foo.bar,这个有意义吗,为什么

Object.prototype.extend = function(object) {
for (property in object) {
this[property] = object[property];
}
return this;
}
可以实现

function extend(ob1, ob2) {
for (property in ob2) {
ob1[property] = ob2[property];
}
return ob1;
}
不能实现

这个又是为什么?

问题多了点,麻烦各位大哥啦:)
...全文
272 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hejunbin 2006-10-07
  • 打赏
  • 举报
回复
:)谢谢!!!
BlueDestiny 2006-10-07
  • 打赏
  • 举报
回复
刚才写了文章,就顺便把代码一并贴过来吧,改了一下代码执行,这样理解就明白了


<script>
foo = {
'bar': function () {
var oSelf = this;
alert(this.toString);
if (oSelf==window) {
oSelf = foo;
}
alert(oSelf);
},
'toString': function () {
return 'foo';
}
};

window.toString = function () {
alert("引用全局this --- window");
}

foo.bar();
(foo.bar)();
(foo.bar || null)();
bar = foo.bar; bar();
</script>
BlueDestiny 2006-10-07
  • 打赏
  • 举报
回复
关于下面的extend函数与object原型,不知道你实现是何意,都是可以实现的。我写了个例子:

<script type="text/javascript">
//<![CDATA[
Object.prototype.extend = function(object) {
for (property in object) {
this[property] = object[property];
}
return this;
}


function extend(ob1, ob2) {
for (property in ob2) {
ob1[property] = ob2[property];
}
return ob1;
}
var foo = {
alert: function(){alert("never-online");}
}
var bar = {
alert: function(){alert("BlueDestiny");}
}
foo.alert();//未重写alert方法
foo.extend(bar)
foo.alert();//继承后重写了alert方法

var o=extend(foo,bar)
o.alert();//继承后重写了alert方法

//]]>
</script>
BlueDestiny 2006-10-07
  • 打赏
  • 举报
回复
问题太多了,我说下我的看法,可能写得有点乱:P

<body>
<script type="text/javascript">
foo = {
'bar': function () {
alert(this);
},
'toString': function () {
return 'foo';
}
};
foo.bar();
//1. alert隐式调用toString方法,转型成字符串,在foo里重写了toString方法,因此为foo


(foo.bar)();
//2. 我这里打印出来的是foo,不知道你用的是什么浏览器,我在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里都是foo


(foo.bar || null)();
/*
3. 这里在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里有不同的效果,IE和Opera都是object,Mozilla的为foo
暂且不谈这几个的JS对||的解释方法,这与bar方法中的this还有和||运算符是有关的。经过||之后
这里的this已经不再为window了,this关键字的作用,如果按照C++的理解,应该为动态联编,而非静态联编,我们平常的例子中
(function (){
this.div = document.createElement("div");div.innerHTML="never-online";
document.body.appendChild(div);
this.div.onclick = function(){
alert(this.tagName);//这里的this就是div而非匿名函数中的this
}
})()
也就是说,这里this的作用域不再是foo对象,而是一个全局的作用域。因此alert(this)相当于alert(window);
所以为object
*/



bar = foo.bar; bar();//返回的是"[object Window]"
/*4. 这里在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里都为相同的object
理由同上,这里把foo.bar的引用给到一个全局变量bar,而全局变量都隶属于window的引用,看下面代码:
var a = 'never-online';
alert(this.a); //never-online
alert(window.a); //never-online
如果你尝试着把bar = foo.bar; bar();改成以下代码,或许就可以明白了
foo.alert = foo.bar; foo.alert ();
这里的foo.alert依然为foo对象的引用,因此foo对象里的this,在这里依然有效,并没有成为window object
*/
</script>
</body>

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧