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