美文网首页
JavaScript——面向对象(一)

JavaScript——面向对象(一)

作者: 郭子林 | 来源:发表于2016-07-26 21:25 被阅读12次

“面向对象编程”(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、构造函数的特点
<li>函数体内部使用了this关键字,代表了所要生成的对象实例。
<li>生成对象的时候,必需用new命令,调用Vehicle函数。</li>

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面向对象学习笔记

    @(JS技巧)[面向对象] JavaScript面向对象学习笔记 封装 Javascript是一种基于对象(obj...

  • JavaScript学习

    javascript面向对象 初学javascript,感觉javascript的面向对象编程还是很有意思的,在此...

  • javascript的面向对象

    javascript面向对象 初学javascript,感觉javascript的面向对象编程还是很有意思的,在此...

  • ajax

    1. 面向对象 javascript 具有面向过程,面向对象,函数式编程的特点 javascript 重要 原型/...

  • Javascript面向对象编程

    阮一峰文档备忘 Javascript 面向对象编程(一):介绍封装 Javascript 面向对象编程(二):介绍...

  • 构造函数与 new 命令

    JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScript 如何进行面向对象编程。 对象...

  • 重新认识JavaScript面向对象: 从ES5到ES6

    一. 重新认识面向对象 1. JavaScript是一门面向对象的语言 在说明JavaScript是一个面向对象的...

  • js高级

    学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript ...

  • JavaScript 高级(备忘)

    在线地址:JavaScript 高级 目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式...

  • 06-JavaScript高级

    学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript ...

网友评论

      本文标题:JavaScript——面向对象(一)

      本文链接:https://www.haomeiwen.com/subject/udtojttx.html