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

猜你喜欢

转载自blog.csdn.net/Qdynasty/article/details/84203958
今日推荐