javascript 簡要概述(二)
javascript面向物件
javascript竟然也可以面向物件,厲害了。在javascript中建立物件是這樣的
function foo(n){
this.name =n;
}
var obj=new foo("ww");
console.log(obj.name);
//輸出結果為ww
其中function foo()充當了類的作用,this.name有那麼點建構函式的意思,這裡的this與python中self相似。建立物件是用new宣告,這和java等程式語言相似。
當然類foo中的其他方法也可以寫在foo{}中,但是由於javascript並不像其它面向物件的語言一樣,物件通過引用類中的方法,而是物件生成時,在物件的儲存空間中也存了對應的方法。這樣多個物件便會有一些儲存空間存放相同的東西,這樣有些佔記憶體。可以使用prototype來解決這個問題,具體事例如下:
function foo(n){
this.name =n;
}
var obj=new foo("ww");
console.log(obj.name);
foo.prototype.sayName=function(){
console.log(this.name);
}
通過prototype(原形)將方法新增至foo中,在通過物件呼叫時,便會從foo的原形中尋找該方法
也可以通過這樣來新增方法:
foo.prototype={ "sayName":function(){ console.log(this.name); } }
javascript 詞法分析
函式在執行的瞬間,生成一個活動物件(Active Object),簡稱AO
第一步:分析引數:
函式接收形式引數,新增到AO的屬性,並且這個時候值為undefine,
接收實參,新增到AO的屬性,覆蓋之前的undefine
第二步:分析變數宣告:
如果上一步分析引數中AO還沒有該屬性,則新增AO屬性為undefine,
如果AO上面已經有該屬性了,則不作任何修改
第三步:分析函式的宣告:
如果有函式名和之前屬性同名,則將屬性覆蓋,即函式名優先順序最高。
事例函式
function func(age) { console.log(age); var age = 25; console.log(age); function age() { } console.log(age); } func(18); 執行結果為ƒ age() { } 25 25
詞法分析:
第一步,分析函式引數:
形式引數:AO.age = undefined
實參:AO.age = 18
第二步,分析區域性變數:
第3行程式碼有var age,但此時第一步中已有AO.age = 18,故不做任何改變
即AO.age = 18
第三步,分析函式宣告:
第5行程式碼有函式age,則將function age(){}付給AO.age,即AO.age = function age() {} 即function 的優先順序最高
第2行程式碼執行時拿到的age是詞法分析後的AO.age,結果是:function age() {};
第3行程式碼:25賦給age,此時age=25;
第4行程式碼執行時age已被賦值為25,結果25;
第5,6行程式碼是一個函式表示式,所以不會做任何操作;
第7行程式碼執行時age仍然是25,結果也是25。
function func(age) {
var age;
console.log(age);
var age = 25;
console.log(age);
function age() {
}
console.log(age);
}
func(18);