什么是面向对象?

面向对象编程(Object Oriented Programming,OOP编程)是一种计算机编程架构,它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。

抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征

面向对象的目的

  • 重用性: 针对相同功能可以重复地使用程序。
  • 灵活性: 针对差异性的功能做出调整与适配。
  • 扩展性: 针对功能的变化做出添加或删除的改进。

面向对象的特性

  • 封装性: 封装是一种信息隐蔽技术,使得用户只能见到对象的外特性,而对象的内特性对用户是隐蔽的。封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,子须用设计者提供的接口来访问该对象。
  • 继承性: 复用一些原有的功能,同时可修改和扩充。
  • 多态性: 对象根据所接收的信息而做出动作。同一信息为不同的对象接受时可产生完全不同的行动。

面向对象的组成

  • 属性(property): 描述一种状态
  • 方法(methods): 描述一种行为
  • 程序中: 变量就是属性,函数就是方法

创建面向对象程序

在面向对象编程中,是通过“类”来创建对象的,类相当于模具。根据传递的数据来创建对选哪个,并且可以重复的创建对象。

在ES6之前的JavaScript版本中,是没有类的概念的,不过可以利用构造函数来代替类进行创建对象。

在构造函数跟普通函数并没有太大区别,只是调用的时候需要通过new关键字来调用。构造函数中的this会指向创建出来的对象,并且具备隐式返回操作。

定义类一般要求首字母大写,所以定义构造函数也要求首字母大写。

构造函数创建对象

function Foo(name) {
this.name = name;
this.sayName = function() { console.log(this.name)}
} var obj = new Foo('hello');
obj.sayName(); //hello
var obj2 = new Foo('hi');
obj2.sayName(); //hi

对象的引用

  • 类型比较方式 => 对象比较时,值跟引用地址都是相同时才相等。
  • 类型赋值方式 => 对象赋值时,值跟引用地址都进行赋值操作
  • 浅拷贝与深拷贝 =>

浅拷贝与深拷贝

实现对对象的复制操作

浅拷贝是指把对象复制一份,实现原理是使用for...in 遍历对象的属性,浅拷贝只复制一层属性,如果某个属性的值也是一个对象,根据引用类型的特征,这个值为这个对象的指针,复制的只是指向该对象的指针,所以对于包含多层应用类型的对象还是会相互影响

function copy() {
var result = {};
for(var attr in obj) {
result[attr] = obj[attr]
}
return result;
}
var obj = {name: 'hello'};
var obj2 = copy(obj);
obj2.name = 'hi'
console.log(obj.name) // hello
console.log(obj2.name) // hi

上述代码中,copy通过for..in遍历对象属性,obj中name是一个string,为基本数据类型,所以改变obj2.name不会影响到obj.name

但是像下面这种包含多层引用的对象使用浅拷贝不能进行完全复制

function copy() {
var result = {};
for(var attr in obj) {
result[attr] = obj[attr]
}
return result;
}
var obj = {
name: {
age: 20
}
}
var obj2 = copy(obj)
obj2.name.age = 30;
console.log(obj.name.age) //30
console.log(obj2.name.age) //30

对copy函数进行改造,使用递归的方式

function copy() {
var result = {};
for(var attr in obj) {
if (typeof obj[attr] == 'object') {
result[attr] = copy(obj[attr])
}
else {
result[attr] = obj[attr]
} }
return result;
}

原型与原型链

原型 在构造函数下有一个prototype属性叫做原型,构造函数+ 原型整体也是一个对象,叫做原型对象,在原型对象下面可以添加属性和方法

共享 原型对象下的属性和方法,可供多个对象进行共享访问,这样就可以节省内存消耗。

原型链 那么为什么创建出来的对象可以访问到原型对象下面的属性和方法呢?这是通过原型链进行查找的。原型链即:连接对象与原型对象之间的纽带就是原型链。

原型链的最外层为Object.prototype,可通过控制台进行查看

function Foo(name) {
this.name = name;
}
Foo.prototype.sayName = function() { console.log(this.name)
}
var obj = new Foo('hello');
var obj = new Foo('hi'); // __proto__: 内部属性:查找当前对象的原型对象
console.log(obj.__proto__ == Foo.prototype) // true

面向对象的相关方法

在JavaScript中提供了很多跟面向对象相关的语法,这些语法可以辅助我们进行面向对象开发。

constructor 原型对象下唯一默认自带的属性,用于查看对象的构造函数。

instanceof 左边是实例对象,右边是构造函数。它会检查右边的构造函数的原型对象是否在左边对象的原型链上。

in与for...in in运算符返回一个布尔值,表示一个对象是否具有某个属性。for...in循环可获得对象的所有可枚举属性。

function Foo() {
this.name = 'Lee'
}
// Foo.prototype.constructor = Foo; /*
如果采用下面这种定义多个prototype的时候需
要绑定constructor,因为这个新
对象的constructor指向的是Object,不手动绑定的话可能会有意想不到的结果
*/
Foo.prototype = {
constructor: Foo,
sayName: function() { console.log(this.name)}
}
var obj = new Foo();
console.log(obj.constructor) // Foo
console.log(obj instanceof Foo); // true
console.log('name' in obj) // true

JavaScript——面向对象编程的更多相关文章

  1. JavaScript面向对象编程学习笔记

    1  Javascript 面向对象编程 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例 ...

  2. 快速学习JavaScript面向对象编程

    到处都是属性.方法,代码极其难懂,天哪,我的程序员,你究竟在做什么?仔细看看这篇指南,让我们一起写出优雅的面向对象的JavaScript代码吧! 作为一个开发者,能否写出优雅的代码对于你的职业生涯至关 ...

  3. 深入理解Javascript面向对象编程

    深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...

  4. 【转】Javascript 面向对象编程(一):封装

    原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html Javascript ...

  5. Javascript 面向对象编程(一):封装 by 阮一峰

    <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd Edition) 它们都是非常优秀的Java ...

  6. 转:javascript面向对象编程

    作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学 ...

  7. 探讨javascript面向对象编程

    (个人blog迁移文章.) 前言: 下面将探讨javascript面向对象编程的知识. 请不要刻意把javascript想成面向对象编程是理所当然的. javascript里面,对象思想不可少,但是不 ...

  8. JavaScript面向对象编程(一)原型与继承

    原型(prototype) JavaScript是通过原型(prototype)进行对象之间的继承.当一个对象A继承自另外一个对象B后,A就拥有了B中定义的属性,而B就成为了A的原型.JavaScri ...

  9. JavaScript面向对象编程(二)构造函数和类

    new关键字和构造函数 在文章JavaScript面向对象编程(一)原型与继承中讨论啦JavaScript中原型的概念,并且提到了new关键字和构造函数.利用new关键字构造对象的实例代码如下: // ...

  10. JavaScript 面向对象编程(三)如何写类和子类

    在JavaScript面向对象编程(一)原型与继承和JavaScript面向对象编程(二)构造函数和类中,我们分别讨论了JavaScript中面向对象的原型和类的概念.基于这两点理论,本篇文章用一个简 ...

随机推荐

  1. java并发学习--第六章 线程之间的通信

    一.等待通知机制wait()与notify() 在线程中除了线程同步机制外,还有一个最重要的机制就是线程之间的协调任务.比如说最常见的生产者与消费者模式,很明显如果要实现这个模式,我们需要创建两个线程 ...

  2. 牛客ACM赛 C 区区区间间间

    链接 C 区区区间间间 给定长度为\(n\)序列,求\[\sum_{i=1}^{n} \sum_{j=i}^{n} max-min\] 其中\(max\),\(min\)为区间最大,最小值,\(n\l ...

  3. linux运维、架构之路-网络基础

    一. 常用网络设备 1.交换机:实现多台主机之间互相通讯的需求 交换机实现互相通讯的要求: ①主机身份标识信息:mac地址,利用源mac和目标mac地址,进行身份信息识别 ②主机通过交换机识别目标主机 ...

  4. MongoDB与阿里云达成战略合作,最新数据库独家上线阿里云!

    11月26日,开源数据库厂商MongoDB与阿里云在北京达成战略合作,作为合作的第一步,最新版MongoDB 4.2数据库产品正式上线阿里云平台. 目前阿里云成为全球唯一可提供最新版MongoDB服务 ...

  5. OC + RAC (十) 常用宏

    . RAC(TARGET, [KEYPATH, [NIL_VALUE]]) :用于给某个对象的某个属性绑定. // 只要文本框文字改变,就会修改label的文字 RAC(self.labelView, ...

  6. servlet中中文正常显示,mysql数据库手动插入中文正常显示,servlet向mysql中插入中文显示乱码

    作者:http://5563447.blog.51cto.com/5553447/1422627 问题是:就是POST请求提交表单数据给servlet,通过JDBC插入Mysql,出现中文乱码. 解决 ...

  7. Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》

    当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台.几十台.几百台.然而,用户访问时是通过如http://www.XX.com的方式访问,在请求时,浏览器首先会查询DNS服务 ...

  8. 谜之WA

    完全k叉树 谜之WA #include<bits/stdc++.h> using namespace std; typedef unsigned long long ll; ll k,n; ...

  9. 表单input中disabled提交后得不到值的解决办法

    input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题.  

  10. 阿里云不支持stmp 的25端口,必须

    第一种方法 到阿里云解封25端口 特别注意阿里云的<25端口使用服务协议>:    我/我公司承诺并保证TCP 25端口仅用来连接第三方的SMTP服务器,从第三方的SMTP服务器外发邮件. ...