DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
一、基本概念
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());
//报错:对象不支持该方法
posted on 2012-03-16 10:16  DoubleLi  阅读(967)  评论(0编辑  收藏  举报