1. 程式人生 > >javascript 簡要概述(二)

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);