关闭

js入门(六)——Object

210人阅读 评论(0) 收藏 举报
分类:

基础

        类似于Java中的Object类,是所有类的基类,并且属性时动态,初始化方式有两种:
      //  var a = new Object();
    	var obj = {};

自定义类型

        在java中,new一个对象时调用的是该类的构造方法,其本质还是new关键字加上一个方法。如此类似,js中创建对象也是new+方法。因此,只需要定义一个方法,然后通过new+该方法即可。如下:
		function Demo(){//方法
			this.name = "这是name";
		}
		var b = new Demo();//new + 方法
		alert(b.name);//引用对象中的属性
        从这也可看出,方法实质上仍旧是对象。

定义属性        

        一个object类型的对象可以动态地添加任何属性。可以通过obj.name或者obj["属性名"](属性名一定要加双引号)引用该属性的值。如:

      //  var a = new Object();
    	var obj = {};
        alert(obj.constructor);
        obj.name="name";//类似于java,通过.的形式引用属性
        obj["age"] = 16;
        alert(obj["name"]);
        alert(obj.age);

        上面通过.的形式定义了名为name的属性,通过obj[""]定义了名为age的属性。

        也可以在创建对象时指定属性名与属性值,格式为:{属性名:属性值,属性名:属性值……}。如下:

		var b = {name:"anme",age:13};
		alert(b.name);//输出结果为anme

特性

        在js对象中,key值(或者是属性)永远不会重复。为同一个属性进行赋值时,是后面的属性将前面的属性给覆盖掉,而不是后面的属性值将前面的属性值给覆盖掉。

        利用该特性,可以将数组中的元素进行除重操作。主要思路为:将数组中的每一个元素做为一个obj的属性,同时做为该属性的值。这样将数组遍历完成后,obj的属性和属性值便是数组中所有的不重复的元素。现将obj进行遍历,取出所有的属性赋值给新数组即可。如下:

          var a = [10,3,4,6,5,7,3,5,9,10,1,4];

          function removeRepeat(array){
            var obj = {};
            for(var b in array){
              //第一种:使用这种方法返回的结果便是没有经过排序的
              //obj["val"+array[b]] = array[b]; 
              //第二种:
              obj[array[b]] = array[b];//使用数组元素为obj生成属性和属性值
            }
            var result = [];
            //遍历obj,取出所有的属性,并将属性添加到新数组中
            for(var c in obj){
              result.push(c);//这里也可用obj[c],但如果使用第一种方法是这里只能用obj[c]
            }
            return result;
          }
          
          alert(removeRepeat(a));

删除属性

        使用delete关键字可以删除对象的属性或者方法,注意:delete只能删除对象的属性和方法。如:

    	var obj = {};
        obj.name = "haha";
        alert(obj.name);
        delete obj.name;
        alert(obj.name);

遍历属性

        使用for in语句遍历对象中的所有属性。如下 :

    	var obj = {};
        alert(obj.constructor);
        obj.name="name";//类似于java,通过.的形式引用属性
        obj["age"] = 16;
        for(var a in obj){
            alert(obj[a]);//注意与obj["age"]的区别,后者指的是obj中名为age的变量
        }

        上面a变量只是obj中属性名,并不是该属性对应的值。通过obj[a]的形式获取该属性对应的值

        obj.name与obj["name"]:表示对象obj中有一个名为name的属性。

        obj[name]:表示obj中有一个名为变量name的值的属性,name的值表示属性的名。如name的值为age,那么obj[name]等价于obj.age或者obj["age"]。

		var c = {};
		c.name = "这是c的name";
		var d = "name";
		alert(c[d]);//输出的是"这是c的name"

        因此,在for in语句中变量表示的是各种可枚举的属性名。如下:

		var a = {};
		a.name = "name";
		a.age = 13;
		a.sex = 1;
		for(var b in a){
			alert(b+"---"+a[b]);
		}

属性与方法

        constructor:获取当前对象的创建函数。可以通过constructor属性判断当前对象是否是某个类的实例。如下:

      var array = [];
       document.write(array.constructor == Array);//输出true,表示array是一个数组。别的对象类似
        defineProperty():为指定的对象重置指定的属性。第一个参数为对象,第二个参数为要设置的属性,第三个参数为属性要设置的值及其它的一些说明,一般传递一个对象。如下:
		var p1 = new Person();
		Object.defineProperty(p1,"constructor",{
			enumerable:false,//指定该属性是否可被枚举
			value:Person//该属性的值
		});

        isPrototypeOf():判断当前对象是不是参数的原型。

        hasOwnProperty(String):判断当前对象中是否有以参数为名的属性,该属性只能属于对象而不能属于对象的原型。如

            var a = {};
            a.name = "name";
            var result = a.hasOwnProperty("name");//true,属性名区分大小写
            alert(result);
            var result2 = a.hasOwnProperty("age");//false
            alert(result2);
            var b = {};
            alert(b.hasOwnProperty("name"));//false,将name换成constructor也返回false,因为constructor属性原型

        propertyIsEnumerable(String):判断参数是否可被枚举,需满足两个条件:1,属于对象而不属于原型;2,可以通过for in语句遍历出来,是自定义的属性。用于检测该属性能否被for in语句枚举出来。例如contructor是不能被枚举的。

        getPrototypeOf():获取参数的原型对象。直接通过Object调用,类似于java中的静态方法。

		function Person(){
		}
		var obj = Person.prototype;//其原型指向一个对象,将该对象引用赋值给obj
		var p1 = new Person();
		document.write(Object.getPrototypeOf(p1) == obj);//true。

        keys():以数组的形式返回对象自己的属性名。对象自己的属性名指的是直接对该对象定义的属性,而不是从原型处继承过来的属性,包括字段和函数。使用方法与getPrototypeOf()一样。它仅返回可枚举的属性和方法

        getOwnPropertyNames():与keys类似,但该方法可以返回不能被枚举的。

示例

        创建一个类,并为该类提供方法:

		function Demo(){//类似java中创建一个Demo类
			var obj = {};
			//为Demo类提供put方法
			this.put = function(key,value){
				obj[key] = value;
			}
			//为Demo提供get方法
			this.get = function(key){
				return obj[key];
			}
			//定义each方法,其中参数为一个函数
			this.each = function(fn){
				for(var att in obj){
					fn(att,obj[att]);
				}
			};
		}
		var b = new Demo();//类似java中创建Demo对象
		b.put("name","这是name");//调用对象的put方法
		alert(b.get("name"));//调用对象的get方法
		b.put("name","这是name2");
		alert(b.get("name"));
		b.put("age",13);
		b.put("sex","非男非女");
		//调用each方法,将一个函数作为参数传递进去
		b.each(function(key,value){
			alert(key+"--"+value);
		});
        在上述代码中定义obj时,只是通过var进行声明,并没有使用this.obj,而定义方法时却是用this.。使用this时表示为该类添加了一个属性或者方法,而不使用时表示该变量只是一个局部变量,外部无法访问到。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12890次
    • 积分:734
    • 等级:
    • 排名:千里之外
    • 原创:64篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类