Javascript 对象用法

简介: 一、基本概念 1,自定义对象。     根据JS的对象扩展机制,用户可以自定义JS对象。与自定义对象相对应的是JS标准对象,例如Date、Array、Math等等。2,原型(prototype)     在JS中,这是一种创建对象属性和方法的方式,通过prototype可以为对象添加新的属性和方法。
一、基本概念
1,自定义对象。
     根据JS的对象扩展机制,用户可以自定义JS对象。与自定义对象相对应的是JS标准对象,例如Date、Array、Math等等。
2,原型(prototype)
     在JS中,这是一种创建对象属性和方法的方式,通过prototype可以为对象添加新的属性和方法。通过prototype我们可以为JS标准对象添加新的属性和方法,例如对于String对象,我们可以为其添加一个新的方法trim()。我们可以在运行期间为JS对象动态添加新的属性。
 
二、语法规则

   1、对象创建方式

      1)对象初始化器方式
          格式:objectName = {property1:value1, property2:value2 , … , propertyN:valueN}
              property:对象的属性
              value:对象的值,值可以是字符串、数字或对象三者之一
         // 例:初始化User对象
         var  user1  =  { name:  " user1 " , age:  18  };
        alert(user1.name);

 

        // 例,初始化对象
         var  user  =  { name:  " User1 " , job: { salary:  3000 , title:  " programmer " } };
        alert(user.job.salary);

     

         // 例、初始化User对象
         var  user2  =  { name:  " user1 " , age:  18 , getName:  function  () {  return   this .name; } };
        alert(user2.getName());  

 

       后面将以构造函数方式为重点进行讲解,包括属性和方法的定义等等,也针对构造函数的方式进行讲解。

 

      2)构造函数方式
      编写一个构造函数,并通过new方式来创建对象,构造函数本可以带有构造参数
         // 编写构造函数
         function  User(name, age) {
        
// this.name:表示对象的属性
         this .name  =  name;
        
this .age  =  age;
        
this .canFly  =   false ;
        }

        
// 创建对象
         var  user1  =   new  User( " aaa " 100 );
        alert(user1.name);

 

  2、定义对象属性
    1)JS中可以为对象定义三种类型的属性:私有属性、实例属性和类属性。

        私有属性只能在对象内部使用。

        实例属性必须通过对象的实例进行引用。

        类属性可以直接通过类名进行引用。(相当于c#静态属性或变量)

    2)私有属性定义
        私有属性只能在构造函数内部定义与使用。
        语法格式:var propertyName=value;

         // 例、私有属性
         function  User(age) {
        
this .age  =  age;
        
// 定义私有属性,私有属性只能在对象内部使用,
         var  isChild  =  age  <   12 ;
        
this .isLittleChild  =  isChild;
        }

        
var  user  =   new  User( 15 );
        alert(user.isLittleChild);

 

    3)实例属性定义,也存在两种方式:
         prototype方式,语法格式:functionName.prototype.propertyName=value。
         this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置。
         上面中语法格式中的value可以是字符创、数字和对象。

         // prototype方式
         function  User() { };
        
// 实例属性
        User.prototype.name  =   " user1 " ;
        User.prototype.age 
=   18 ;
        
var  user  =   new  User();
        alert(user.name);

       
// this方式
         function  User(name, age) {
            
// this方式的实例属性
             this .name  =  name;
            
this .age  =  age;
        }

 

    4)类属性定义
        语法格式:functionName.propertyName=value
         function  User() { };
        User.Max_Age 
=   200 ;
        User.Min_age 
=   0 ;
        alert(User.Max_Age);

 

    5)对于属性的定义,除了上面较为正规的方式外,还有一种非常特别的定义方式,语法格式: obj[index]=value
       function  User(name) {
        
this .name  =  name;
        
this .age  =   18 ;
        
this [ 1 =   " ok " // 以Index方式定义
         this [ 200 =   " year " ;
        }
        
var  user  =   new  User( " user1 " );
        alert(user[
1 + "   " +  user[ 200 ]);

     注意:通过index方式定义的必须使用index方式来引用,而没有通过index方式定义的,必须以正常方式引用。

 

  3、定义对象方法
    1)JS中可以为对象定义三种类型的方法:私有方法、实例方法和类方法:
         私有方法只能在对象内部使用
         实例方法必须在对象实例化后才能使用
         类方法可以直接通过类名去使用。(相当于c#静态方法)
         注意:方法的定义不能通过前面所说的index方式进行。

 

    2)定义私有方法
        私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。
        语法格式:function methodName( arg1 , … , argN){ } 

         function  User(name) {
        
this .name  =  name;
        
// 私有方法
         function  getNameLengh(nameStr) {
        
return  nameStr.length;
        }

        
this .nameLength  =  getNameLengh( this .name);
        }
        
var  user  =   new  User( " aaron " );
        alert(user.nameLength);

 

    3)定义实例方法

        目前也可以使用两种方式:

        prototype方式,在构造函数外使用,语法格式:functionName.prototype.methodName=method;
                               或者 functionName.prototype.methodName=function(arg1,…,argN){};
        this方式,在构造函数内部使用,语法格式:this.methodName=method;
                               或者  this.methodName=function(arg1 , … ,argN){};
        上面的语法格式描述中,method是外部已经存在的一个方法,methodName要定义的对象的方法,意思就是将外部的一个方法直接赋给对象的某个方法。

         以function(arg1,…,argN){}的方式定义对象方法是开发人员应该掌握的。  

         // prototype方式
         function  User(name) {
        
this .name  =  name;
        
// 实例方法。
         this .getName  =  getUserName;
        
this .setName  =   function  (name) {  this .name  =  name; };
        }
        
function  getUserName() {
        
return   this .name;
        }

        
var  user  =   new  User( " aaron " );
        alert(user.getName());

        
// this方式
         function  User(name) {
        
this .name  =  name;
        
this .getName  =   function  () {
        
return   this .name;
        };
        
this .setName  =   function  (newName) {
        
this .name  =  newName
        }
        }

        
var  user  =   new  User( " aaron " );
        alert(user.getName());

 

         // 定义实例方法其它的一些例子
         function  User(name) {
        
this .name  =  name;
        }
        User.prototype.getName 
=   function  () {  return   this .name; };
        User.prototype.setName 
=  setUserName;
        
function  setUserName(name) {
        
this .name  =  name;
        }

        
var  user  =   new  User( " Aaron " );
        alert(user.getName());

  

    4)定义类方法
         类方法需要在构造函数外面定义,可以直接通过构造函数名对其进行引用。
         语法格式:functionName.methodName=method;
         或者 functionName.methodName=function(arg1 , … , argN){};
         // 写法1
         function  User(name) {
        
this .name  =  name;
        }       
        User.getMaxAge 
=  getUserMaxAge;
        
function  getUserMaxAge() {
        
return   200 ;
        }
        alert(User.getMaxAge());

        
// 写法2
         function  User(name) {
        
this .name  =  name;
        }      
        User.getMaxAge 
=   function  () {  return   200 ; };
        alert(User.getMaxAge());

  4、属性与方法的引用
    1)从可见性上说:
         私有属性与方法,只能在对象内部引用。
         实例属性与方法,可以在任何地方使用,但必须通过对象来引用。
         类属性与方法,可以在任何地方使用,但不能通过对象的实例来引用

 

    2)从对象层次上说:
        可以进行深层次的引用。几种方式:
           简单属性:obj.propertyName
           对象属性:obj.innerObj.propertyName
           索引属性:obj.propertyName[index]
          对于更深层次的引用与上面类似。

    3)从定义方式上说:
         通过index方式定义的属性,必须通过index方式才能引用。
         通过非index方式定义的属性,必须通过正常的方式才能引用。
         另外注意:对象的方法不能通过index方式来定义。

  5、属性与方法的动态增加和删除
    1)对于已经实例化的对象,我们可以动态增加和删除它的属性与方法,语法如下(假定对象实例为obj):
         动态增加对象属性 obj.newPropertyName=value;
         动态增加对象方法  obj.newMethodName=method或者=function(arg1,…,argN){}
         动态删除对象属性  delete obj.propertyName
         动态删除对象方法  delete obj.methodName
   
    2)例子:

 

     function  User(name){
             
this .name = name;
             
this .age = 18 ;
    }
    
var  user = new  User(“user1”);
    user.sister
= “susan”;
    alert(user.sister);
// 运行通过
     delete  user.sister;
    alert(user.sister);
// 报错:对象不支持该属性

    user.getMotherName
= function (){ return  “mary”;}
    alert(user.getMotherName());
// 运行通过
     delete  user.getMotherName;
    alert(user.getMotherName());
// 报错:对象不支持该方法
目录
相关文章
|
15天前
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
|
25天前
|
JavaScript 前端开发
Math对象:JavaScript中的数学工具
Math对象:JavaScript中的数学工具
27 1
N..
|
1月前
|
存储 JavaScript 前端开发
JavaScript中的对象
JavaScript中的对象
N..
10 0
|
1月前
|
JavaScript 前端开发
JavaScript对象系列(菜菜出品,必看!!!)
JavaScript对象系列(菜菜出品,必看!!!)
|
1月前
|
JavaScript 前端开发
javascript中的switch用法
javascript中的switch用法
|
18天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
1月前
|
存储 JavaScript 前端开发
在JavaScript中,对象和数组是如何进行扩展的?
在JavaScript中,对象和数组是如何进行扩展的?
22 4
|
2天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
16 3
|
3天前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
【4月更文挑战第23天】JavaScript的this关键字根据执行环境指向不同对象:全局中指向全局对象(如window),普通函数中默认指向全局对象,作为方法调用时指向调用对象;构造函数中指向新实例,箭头函数继承所在上下文的this。可通过call、apply、bind方法显式改变this指向。
7 1
|
4天前
|
JavaScript 前端开发 开发者
JavaScript中的错误处理:try-catch语句与错误对象
【4月更文挑战第22天】JavaScript中的错误处理通过try-catch语句和错误对象实现。try块包含可能抛出异常的代码,catch块捕获并处理错误,finally块则无论是否出错都会执行。错误对象提供关于错误的详细信息,如类型、消息和堆栈。常见的错误类型包括RangeError、ReferenceError等。最佳实践包括及时捕获错误、提供有用信息、不忽略错误、利用堆栈信息和避免在finally块中抛错。