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

 

posted @ 2015-10-19 22:07  Medeor  阅读(428)  评论(0编辑  收藏  举报