我对一个js问题的分析
生活随笔
收集整理的這篇文章主要介紹了
我对一个js问题的分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
qq空間好慢,把我的幾個文章拿過來: ? ? 題目如下:
<script>
function foo(){
??foo.abc = function(){alert('def')}
??this.abc = function(){alert('xyz')}
??abc = function(){alert('@@@@@')};
??var abc = function(){alert('$$$$$$')}
}
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');}
var f = new foo();
f.abc();
foo.abc();
abc();
</script>
問題來自: 中國狐([url]www.foxjs.cn[/url]) 詳細出處參考:[url]http://www.foxjs.cn/article.asp?id=607[/url]
我的分析結果----->
不運行看看什么結果,分析下
1.采用逐步擴展變量的方法分析:
看這個:
<script>
abc = function(){alert('@@@@@')};-----其實這里等價于window.abc=function(){alert('@@@@@')};一個賦值語句
abc();-----其實這里等價于window.abc();
</script>
結果肯定是@@@@@了。
2.放到函數里面賦值
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
abc();
</script>
在執(zhí)行foo();之前是什么也不會輸出的,因為還沒有對abc賦值,也就是函數引用為null
如果這樣,
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
foo();//函數執(zhí)行了賦值語句
abc();
</script>
就會輸出@@@@@了。
3.看看構造函數
function foo()
{
this.abc = function(){alert('xyz')}------有了this就成為了構造函數
abc = function(){alert('@@@@@')};--window.abc
}
foo();//產生一個匿名對象?然后銷毀?
abc();
</script>
上面只是當作了普通的函數執(zhí)行了賦值語句。
結果:@@@@@
再看如下:
<script>
function foo()
{
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();---this指向了f
abc();---window.abc()
</script>
結果:xyz?? @@@@@
再看
<script>
function foo()
{
foo.abc=function(){alert('def');};---對比下window.abc=function{alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();
foo.abc();---這里類似window.abc();
abc();
</script>
結果:xyz?? def?? @@@@@
4.
<script>
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}--添加了個局部作用域的abc在foo()函數內部會覆蓋
---例如在這里調用abc()會執(zhí)行局部的函數
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
結果和上面的相同。
看下面的:
<script>
foo.abc = function(){alert('123');}---在調用new foo()之前賦值會在后面被重寫
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
結果還是一樣。
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
foo.abc = function(){alert('123');}---但是在new foo()調用之后,而foo.adb()調用之前重寫函數,結果受影響
f.abc();
foo.abc();
abc();
</script>
結果:xyz??123??@@@@@
5.原型對象prototype
<script>
function foo()
{
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
結果:456
雖然foo()內部沒有明確的定義方法abc()但是我們發(fā)現好像foo類定義了一個abc()方法似的。---等于我們?yōu)閒oo類的父類添加了一個可繼承的方法
下面重寫方法覆蓋父類中的方法
<script>
function foo()
{
this.abc = function(){alert('xyz')}
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
結果:xyz
<script>
function foo(){
??foo.abc = function(){alert('def')}
??this.abc = function(){alert('xyz')}
??abc = function(){alert('@@@@@')};
??var abc = function(){alert('$$$$$$')}
}
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');}
var f = new foo();
f.abc();
foo.abc();
abc();
</script>
問題來自: 中國狐([url]www.foxjs.cn[/url]) 詳細出處參考:[url]http://www.foxjs.cn/article.asp?id=607[/url]
我的分析結果----->
不運行看看什么結果,分析下
1.采用逐步擴展變量的方法分析:
看這個:
<script>
abc = function(){alert('@@@@@')};-----其實這里等價于window.abc=function(){alert('@@@@@')};一個賦值語句
abc();-----其實這里等價于window.abc();
</script>
結果肯定是@@@@@了。
2.放到函數里面賦值
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
abc();
</script>
在執(zhí)行foo();之前是什么也不會輸出的,因為還沒有對abc賦值,也就是函數引用為null
如果這樣,
<script>
function foo()
{
abc = function(){alert('@@@@@')};
}
foo();//函數執(zhí)行了賦值語句
abc();
</script>
就會輸出@@@@@了。
3.看看構造函數
function foo()
{
this.abc = function(){alert('xyz')}------有了this就成為了構造函數
abc = function(){alert('@@@@@')};--window.abc
}
foo();//產生一個匿名對象?然后銷毀?
abc();
</script>
上面只是當作了普通的函數執(zhí)行了賦值語句。
結果:@@@@@
再看如下:
<script>
function foo()
{
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();---this指向了f
abc();---window.abc()
</script>
結果:xyz?? @@@@@
再看
<script>
function foo()
{
foo.abc=function(){alert('def');};---對比下window.abc=function{alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
}
var f=new foo();
f.abc();
foo.abc();---這里類似window.abc();
abc();
</script>
結果:xyz?? def?? @@@@@
4.
<script>
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}--添加了個局部作用域的abc在foo()函數內部會覆蓋
---例如在這里調用abc()會執(zhí)行局部的函數
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
結果和上面的相同。
看下面的:
<script>
foo.abc = function(){alert('123');}---在調用new foo()之前賦值會在后面被重寫
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
f.abc();
foo.abc();
abc();
</script>
結果還是一樣。
function foo()
{
foo.abc=function(){alert('def');};
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
var f=new foo();
foo.abc = function(){alert('123');}---但是在new foo()調用之后,而foo.adb()調用之前重寫函數,結果受影響
f.abc();
foo.abc();
abc();
</script>
結果:xyz??123??@@@@@
5.原型對象prototype
<script>
function foo()
{
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
結果:456
雖然foo()內部沒有明確的定義方法abc()但是我們發(fā)現好像foo類定義了一個abc()方法似的。---等于我們?yōu)閒oo類的父類添加了一個可繼承的方法
下面重寫方法覆蓋父類中的方法
<script>
function foo()
{
this.abc = function(){alert('xyz')}
}
foo.prototype.abc = function(){alert('456');}
var f=new foo();
f.abc();
</script>
結果:xyz
轉載于:https://blog.51cto.com/xcf007/101048
總結
以上是生活随笔為你收集整理的我对一个js问题的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法向会话状态服务器发出会话状态请求。
- 下一篇: C#中如何实现控件数组