javascript面向对象之对象的深入理解
投稿:shichen2014
这篇文章主要介绍了javascript面向对象之对象的深入理解,将javascript面向对象程序设计中一切都视为对象,并以实例形式进一步分析了面向对象的特性,需要的朋友可以参考下
本文进一步分析讲述了javascript面向对象之对象的深入理解。分享给大家供大家参考。
1.面向对象与面向编程的比较
1.1 面向对象(oop)
- 面向对象是把事物分解称为一个个对象,然后由对象之间分工与合作,是以对象功能划分问题,而不是步骤
- 特征: 封装性、继承性、多态性
- 优点: 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
- 缺点: 性能比面向过程低
面向对象的思维特点:
- 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
- 对类进行实例化, 获取类的对象
1.2 面向过程(pop)
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了
- 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
- 缺点:没有面向对象易维护、易复用、易扩展
2. ES6中的类和对象
在js中,对象是一组无序的相关属性和方法的集合,万物皆对象
对象是由属性和方法组成的:
- 属性: 事物的特征,在对象中用属性来表示
- 方法: 事物的行为,在对象中用方法来表示
在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象
类与对象的区别:
- 类抽象了对象的公共部分,它泛指某一大类(class)
- 对象特指某一个,通过类实例化一个具体的对象
2.1 类的创建
语法:
class name { // 添加属性和方法,也可以再嵌入一个类 class age {}, }
创建实例
let a = new name(); // 类必须使用new实例化对象
2.2 类 constructor 构造函数
constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()
语法:
class Person { constructor(name,age) { // constructor 构造方法或者构造函数 this.name = name; this.age = age; } sayHi() { console.log('我会唱歌'); } // 注意,方法之间不需要加逗号。同时函数不需要加function关键字 }
创建实例:
var ldh = new Person('刘德华', 18); console.log(ldh.name); ldh.sayHi();
2.3 类的继承
实例:
class Father { constructor(surname) { this.surname= surname; } say() { console.log('你的姓是' + this.surname); } } class Son extends Father{ // 这样子类就继承了父类的属性和方法 } var damao= new Son('刘'); damao.say();
super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数,也可以调用父类的普通函数
语法:
class Father { constructor(x,y) { this.x = x; this.y = y; } sum() { console.log(this.x + this.y); } say() { return '我是爸爸'; } } class Son extends Father{ constructor(x,y) { // this.x = x; // this.y = y; super(x,y); // 调用了父类中的构造函数 ,super必须写在子类this之前调用 // 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法) this.x = x; this.y = y; } say() { console.log(super.say() + '的儿子'); // 利用super调用父类的函数 } substract() { console.log(this.x - this.y); } } var son = new Son(11,2); console.log(son); son.say(); son.substract(); son.sum();
2.4 注意点
- 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象.
- 类里面的共有属性和方法一定要加this使用.
- 类里面的this指向问题.
- constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者
补充
具体分析如下:
javacript面向对象程序设计中,可以理解为一切都是对象。
实例代码如下:
<script language="javascript" type="text/javascript"> function Cat(){ } var cat1 = new Cat();//创建类实例 cat1.name = "小狗"; cat1.age = 4; cat1.color="白色"; document.write(cat1.name); document.writeln(cat1.constructor);//实例化后对象,是对象 document.writeln(typeof(cat1)+"<hr />"); document.writeln(Cat.constructor);//原型对象本身也是对象 document.writeln(typeof Cat+"<hr />"); var b="hello";//字符串也是对象 document.writeln(b.constructor);//输出它的构造函数 document.writeln(typeof b+"<hr />"); var c=123;//数值也是对象 document.writeln(c.constructor); document.writeln(typeof c+"<hr />"); </script>
判断一个实例化对象是不是某个原型对象类型
if(cat1 instanceof Cat){//与php的判断方法相同 window.alert("ok"); }
希望本文所述对大家的javascript程序设计有所帮助。