javascript对象
1.定义:
面向对象:在程序中都是用一个对象来描述现实中一个具体的东西
3大特点:封装 继承 多态
什么是对象:封装多个数据和方法的存储空间
2.创建自定义对象(4种):
1.对象直接量
var obj={
"attbuteName":value,
...:...,
"mothodName":function(){...this.attbuteName...}
2.new Object();
var obj=new Object();//创建一个空对象
obj.attbuteName=value;
obj.mothodName=function(){...this.attbuteName...};
3.利用构造函数反复创建相同结构的对象(构造函数:描述一类对象结构的特殊函数)
//定义构造函数 Student function Student(sname,age){ this.name=name; this.age=age; this.intrSelf=intrSelf=function(){alert("I'm "+this.sanme+",I'm "+this.age);} } //利用构造函数创建对象: var liLei=new Student("Li Lei",12); var hmm=new Student("Han Meimei",11);
4.Object.create(父对象,{扩展属性的列表对象})
5.访问属性(2种方法): obj.属性名 obj["属性名"]
(访问数组中不存在的下标):不会报错,放回undefined
强行给不存在的属性赋值,不会报错,js会自动创建同名属性
6.判断某个对象是否包含制定成员(3种):
obj.hasOwnProperty("成员名")
"属性名" in 对象
直接使用 obj.对象名作为条件
1 /* 2 String类型提供了trim方法,但IE8没有 3 判断当前浏览器的String类型是否包含trim方法 4 如果不包含,自定义公共trim方法 5 */ 6 if(!String.prototype.trim) 7 { 8 String.prototype.trim=function(){ 9 return this.replace(/^\s|\s$/g,""); 10 } 11 } 12 var str=" Hello World ! "; 13 document.write(str.trim());
3.this
如何在方法中,访问当前对象自己(使用this);
this关键字:运行时,指代正在调用方法的对象(.当前对象)
this本质是window下唯一一个指针,指向当前正在调用方法的对象
在方法内访问当前对象自己的属性,必须使用this.属性名
***this和定义在哪无关!仅和调用时使用的当前对象有关
***如果无主的调用或赋值,默认this都是window
/*this.*/a=100; //window.a=100; (function(){ var a=99; console.log(this.a); //window.a })(); //100 //***如果无主的调用或赋值,默认this都是window
1 /*鄙视题*/ 2 //this-->window 3 var a=2; 4 //this-->window 5 function fun(){ 6 console.log(this.a); 7 } 8 //this-->window 9 var o={a:3,fun:fun};//this-->o 10 var p={a:4};//this-->p 11 o.fun(); //this-->o 3 12 console.log(o.a) //3 13 14 (p.fun=o.fun)(); //2 == fun() 15 /*赋值表达式的结果相当于等号右侧表达式*的值**/
4.继承
js中一切继承都是用原型对象实现的
原型对象:每个函数对象都有一个原型对象
构造函数的原型对象负责保存所有子对象共享的成员
建议:所有子对象共享的方法,都应该定义在构造函数的原型对象中。--避免重复定义方法对象,浪费内存
说明:所有内置对象类型的API都定义在类型[type].prototype中
1 //在构造函数原型对象中定义公共方法 2 Student.prototype.intrSelf=function(){ 3 alert("I'm "+this.sname+",I'm "+this.age); 4 } 5 var lilei=new Student("Li Lei",12); 6 var hmm=new Student("Han Meimei",11); 7 //在构造函数原型对象中定义公共属性 8 Student.prototype.money=100; 9 console.log(lilei.money); 10 //先在当前对象本地找 11 //找不到再去查找原型链 12 //原型链也没有,才返回undefined
13 console.log(hmm.money); 14 /* 定义在构造函数的原型对象中,避免了实例化重复定义方法,减少内存的占用 15 */
1 //使用Object.create创建对象继承 2 3 //父对象 4 var father={car:"BMW",balance:100000000}; 5 //继承父对象 6 var hmm=Object.create(father, 7 {sing:{value:sing},//扩展方法 8 sname:{value:"Han Meimei"},//扩展属性 9 age:{value:18,writable:false},//扩展属性 不可写 10 intrSelf:{value:intrSelf}//扩展方法 11 } 12 ); 13 //扩展方法 14 function intrSelf(){ 15 alert("我是"+this.sname+",今年"+this.age); 16 } 17 function toString(){ 18 return "{sname:"+this.sname+", age:"+this.age+"}"; 19 }
js模拟Java中的继承(仅继承结构):
function 子类型构造函数(属性参数1,属性参数2,属性参数3){
父类型构造函数.call(this,属性参数1,属性参数2); //在子构造函数中强行调用父函数的构造函数,继承父构造函数中结构,但是无法继承父函数的原型结构(不再同一条原型链上)
this.属性3=属性参数3;
}
5.扩展对象属性(2种):
1.扩展共有属性:通过构造函数.prototype添加属性
2.扩展自有属性:通过某一个具体子对象添加属性
判断自有属性或公共属性:
1.判断自有属性:obj.hasOwnProperty("属性名")
2.判断共有属性:"属性名" in obj && !obj.hasOwnProperty("属性名") //在原型关系中包含且子对象自己没有
6.删除属性 delete 对象.属性名 //仅能删除当前对象自己的属性,无法删除共有属性
1 //全局变量3中 2 var n=1; 3 delete n;//不能删除 4 window.n=1; 5 delete window.n;//不能删除 6 var window["n"]=1; 7 delete window.n;//可以删除
7.原型链:由各级对象的__proto__逐级继承形成的关系
1 //判断原型链 2 var monkey={ 3 hair:true, 4 feeds:"bananas" 5 } 6 function Human(name){ 7 this.name=name; 8 } 9 10 Human.prototype=monkey; 11 var geoge=new Human("Geoge"); 12 console.log(monkey.isPrototypeOf(geoge));//true 13 console.log(Object.prototype.isPrototypeOf(monkey));//true
0 //判断array数组的类型
1 document.write(typeof("Hello")+"<br>"); //string 2 document.write(typeof(123)+"<br>"); //number 3 document.write(typeof({a:1})+"<br>"); //object 4 document.write(typeof([])+"<br>"); //object 5 document.write(Array.isArray([])+"<br>"); //true 6 //如果当前浏览器的Array构造函数对象中不包含isArray 7 if(!Array.isArray){ 8 //为Array构造函数添加isArray方法 9 Array.isArray=function(obj){//4种 10 //判断obj是不是数组类型 11 //1. 如果Array.prototype在obj的原型链中 12 return Array.prototype.isPrototypeOf(obj); 13 //2. instanceof: 14 //语法:obj instanceof 构造函数名 15 //判断obj对象是否被构造函数创建 16 return obj instanceof Array; 17 //实例:一个构造函数创建出的每个具体对象 18 //3. 原型对象的constructor属性 19 return obj.constructor==Array; 20 //4. 利用Object原型的toString方法 21 /*call,applycall,在调用方法的一瞬间更换调用方法的对象*/ 22 return Object.prototype.toString.call(obj)== "[object Array]"; 23 } 24 } 25 document.write(Array.isArray([])+"<br>"); //true 26 document.write(Array.isArray({})+"<br>"); //false