郑炎青吧 关注:6贴子:80
  • 0回复贴,共1

js中的闭包和面向对象

只看楼主收藏回复

晚上的网速简直是回到了石器时代,单位数的kb每秒 怎么上传啊

直接上内容了:
闭包中最常见的方式是函数内部创建子函数,最后返回子函数,如下伪代码:
function A(){
var a = 123;
function B(){
console.log(a);
}
return B
}
var result = A();//调用A函数 返回B函数体
result();//调用B函数 控制器输出结果为123;
上面的函数B就是闭包,用于读取A函数中的局部变量


在js词法分析中 会分为 编译compile阶段 和 执行execute阶段
当脚本处于编译阶段的时 进入到一个函数里面的时候 如果出现形参,变量和函数同名的情况 则优先使用函数名,其次是传进来的实参,再次是形参,依次覆盖
然后是执行阶段 如果存在同名变量有赋值的情况下 那么同名变量将会覆盖往下所有同名的值
效果图:






js中的面向对象
String对象:
var str1 = 'abc';
var str2 = new String('cccc');
console.log(typeof str1,typeof str2);//控制器输出结果 string和object
console.log(str1.charAt(1),str2.charAt(1));//控制器输出结果 b和c
console.log(str1 instanceof String,str2 instanceof String);//结果是 false和true
两个都能使用对象的方法 一个是字面量创建string对象 一个是通过new来创建对象


简单创建对象
var obj = new Object();//通过系统的Object创建对象
obj.name = 'hellow word';//设置属性
obj.age = 24;
obj.getName= function(){ return this.name }//设置方法
这种方式设置对象会让代码冗余,不利于维护


通过工厂方式来创建对象
function createObject(name,age){
var obj = new Object;
obj.name = name;
obj.age = age;
obj.getName = function(){
alert(this.name);

}
return obj;
}
这种方式创建对象无法用instanceof来判断是哪个类的对象




通过构造函数来创建对象
function Person(name,age){
this.name = name;
this.age = age;
this.getName = function(){
alert('my name is'+ this.name);
}
}
//创建对象
var obj1 = new Person('hellow word',24);
var obj2 = new Person('hellow mon',42);
console(obj1 instanceof Person, obj2 instanceof Person);//结果是 true true
console(obj1.getName === obj2.getName)//结果是false 证明这两个方法保存在不同的内存空间 这样浪费空间




通过构造函数组合原型对象来创建函数
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.getName = function(){
return this.name;
}
Person.prototype.email = 'qq.com';
//创建对象obj1和obj2
var obj1 = new Person('zhangsan',11);
var obj2 = new Person('lisi',22);
//修改obj1的name
obj1.name = 'faizel';
console.log(obj1.__proto__ === Person.prototype) //结果为true
console.log(obj2.__proto__ === obj1.__proto__) //结果为true
后面这两个结果,为什么会这样图解:




最后是几个检查函数
1、isPrototypeOf:检测对象是否是某个对象的原型对象
console.log(Person.prototype.isPrototypeOf(obj1));//true


2、constructor :检测对象的构造函数(构造器)
console.log(obj1.constructor);


3、in:检测一个对象空间或原型对象空间是否存在属性
console.log('email' in obj1);//true


4、hasOwnProperty:判断当前对象空间中是否存在一个属性(注:不会去原型上找)
console.log(obj1.hasOwnProperty('email'))//ture


5、delete:删除自身对象空间中的属性,不会删除原型的
delete obj1.name;
console.log(obj1.hasOwnProperty('name'))//false




收收收~~


回复
1楼2017-10-26 00:08