JavaScript——面向对象(一)

“面向对象编程”(Object Oriented Programming,缩写为OOP)是目前主流的编程范式。它的核心思想是将真实世界中各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。

对象

1、对象是对实物的抽象:当实物被抽象成“对象”,实物之间的关系就变成了“对象”之间的关系,从而就可以模拟现实情况,针对“对象”进行编程。
2、“对象”是一个容器,封装了“属性”(property)和“方法”(method)。
所谓“属性”,就是对象的状态;所谓“方法”,就是对象的行为(完成某种任务)。比如,我们可以把动物抽象为animal对象,“属性”记录具体是那一种动物,“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。

构造函数

1、“对象”是单个实物的抽象,一般情况通过模板(概念类似于CSS中的class)表示一类事物的共同特性,对象通过模板生成。JavaScript语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)。
2、JavaScript使用构造函数(constructor)作为生成对象的模板并通过模板,描述对象的基本结构。一个构造函数,可以生成多个有相同的结构对象:
例如:

var Cat = function () { 
    this.name = "dog";
};

3、构造函数的特点

  • 函数体内部使用了this关键字,代表了所要生成的对象实例。
  • 生成对象的时候,必需用new命令,调用Vehicle函数。
  • new 命令

    1、new命令的作用,就是执行构造函数,返回一个实例对象。

    var Cat = function () { 
        this.name = "dog";
    };
    var bark = new Cat()
    bark.name //"dog"
    //new命令,让构造函数Cat生成一个实例对象,保存在变量bark中。
    //这个新生成的实例对象,从构造函数Cat上继承了name属性。
    //在new命令执行时,构造函数内部的this,就代表了新生成的实例对象,
    //this.name表示实例对象有一个name属性,它的值是“dog”
    

    2、使用new命令时,根据需要,构造函数也可以接受参数。

    var Cat = function (a) { 
        this.name = a;
    };
    var bark = new Cat("dog")
    bark.name //"dog"
    

    3、new命令本身就可以执行构造函数,所以后面的构造函数可以带括号,也可以不带括号。下面两行代码是等价的。

    var bark = new Cat()
    var bark = new Cat
    

    4、忘记使用new命令,直接调用构造函数

    var Cat = function () { 
        this.name = "dog";
    };
    var bark =  Cat()
    //TypeError: Cannot read property 'name' of undefined
    //调用Cat构造函数时,忘了加上new命令。
    //结果,name属性变成了全局变量,而变量bark变成了undefined。
    

    解决办法,是在构造函数内部判断是否使用new命令,如果发现没有使用,则直接返回一个实例对象。

    function Fubar(foo, bar){ 
        if (!(this instanceof Fubar)) { 
              return new Fubar(foo, bar); 
        } 
        this._foo = foo; 
        this._bar = bar;
    }
    Fubar(1, 2)._foo // 1
    (new Fubar(1, 2))._foo // 1
    
    Object 对象与继承

    通过原型链,对象的属性分为自身属性和继承的属性。
    1、Object.getOwnPropertyNames()
    该方法返回一个数组,成员是对象本身的所有属性的键名,不包含继承的属性键名。
    只获取那些可以枚举的属性,使用Object.keys方法。
    2、hasOwnProperty()
    该方法返回一个布尔值,用于判断某个属性定义在对象自身(返回true),还是定义在原型链上(返回false)。
    JS唯一一个处理对象属性时不会遍历原型链的方法。
    3、in运算符
    in运算符返回一个布尔值,表示一个对象是否具有某个属性(有true无false)。它不区分该属性是对象自身的属性,还是继承的属性。
    4、for ... in 循环
    获得对象的所有可枚举属性(不管是自身的还是继承的)

    var o1 = {name:"cat"};
    var o2 = Object.create(o1,{
        someOne:{
              like:"music",
              enumerable:true
        }
     });
    for(var s in o2){
        console.log(s);
    }
    

    for...in 与hasOwnProperty()结合可以获得所有的自身属性

    var obj = {p1:12,p2:23,p3:34,p4:45}
    var a=[];
    for ( var name in obj ) { 
          if ( obj.hasOwnProperty(name) ) { 
                a.push(name);
           }
    }
    console.log(a);//["p1", "p2", "p3", "p4"]
    

    你可能感兴趣的:(JavaScript——面向对象(一))