js面向对象编程|24

简介: js面向对象编程|24

JavaScript的所有数据都可以看成对象,那是不是我们已经在使用面向对象编程了呢?

当然不是。如果我们只使用Number、Array、string以及基本的{...}定义的对象,还无法发挥出面向对象编程的威力。

JavaScript的面向对象编程和大多数其他语言如Java、C#的面向对象编程都不太一样。如果你熟悉Java或C#,很好,你一定明白面向对象的两个基本概念:

类:类是对象的类型模板,例如,定义Student类来表示学生,类本身是一种类型,Student表示学生类型,但不表示任何具体的某个学生;

实例:实例是根据类创建的对象,例如,根据Student类可以创建出xiaoming、xiaohong、xiaojun等多个实例,每个实例表示一个具体的学生,他们全都属于Student类型。

所以,类和实例是大多数面向对象编程语言的基本概念。

不过,在JavaScript中,这个概念需要改一改。JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。

原型是指当我们想要创建xiaoming这个具体的学生时,我们并没有一个Student类型可用。那怎么办?恰好有这么一个现成的对象:

var robot = {
    name: 'Robot',
    height: 1.6,
    run: function ()
        console.log(this.name + ' is running...');
    }
};


我们看这个robot对象有名字,有身高,还会跑,有点像小明,干脆就根据它来“创建”小明得了!

于是我们把它改名为Student,然后创建出xiaoming:

var Student = {
    name: 'Robot',
    height: 1.2,
    run: function ()
        console.log(this.name + ' is running...');
    }
};
var xiaoming = {
    name: '小明'
};
xiaoming.__proto__ = Student;


注意最后一行代码把xiaoming的原型指向了对象Student,看上去xiaoming仿佛是从Student继承下来的:

xiaoming.name; // '小明'
xiaoming.run(); // 小明 is running...


xiaoming有自己的name属性,但并没有定义run()方法。不过,由于小明是从Student继承而来,只要Student有run()方法,xiaoming也可以调用:

JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。

如果你把xiaoming的原型指向其他对象:

var Bird = {
    fly: function ()
        console.log(this.name + ' is flying...');
    }
};
xiaoming.__proto__ = Bird;


现在xiaoming已经无法run()了,他已经变成了一只鸟:

xiaoming.fly(); // 小明 is flying...


在JavaScrip代码运行时期,你可以把xiaoming从Student变成Bird,或者变成任何对象。

请注意,上述代码仅用于演示目的。在编写JavaScript代码时,不要直接用obj.__proto__去改变一个对象的原型,并且,低版本的IE也无法使用__proto__。Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有,因此,我们可以编写一个函数来创建xiaoming:

复制  

// 原型对象:

var Student = {
    name: 'Robot',
    height: 1.2,
    run: function ()
        console.log(this.name + ' is running...');
    }
};
function createStudent(name)


   // 基于Student原型创建一个新对象:

var s = Object.create(Student);

   // 初始化新对象:

 

s.name = name;
    return s;
}
var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true


相关文章
|
3天前
|
Oracle 关系型数据库 MySQL
数据源表权限:实现数据消费的精细化权限管理
为满足数据消费中单表消费的场景,Dataphin在V4.3 版本支持对MySQL和Oracle类型的数据源表进行权限管控。
57 31
|
6天前
|
机器学习/深度学习 人工智能 算法
编程之旅:从代码到哲学的启示
【9月更文挑战第20天】在编程的世界里,每一行代码都是思考的足迹,每一个算法都蕴含着解决问题的智慧。正如甘地所言,“你必须成为你希望在世界上看到的改变。” 本文将带你走进编程的内在世界,探索如何通过技术提升自我,实现个人成长和变革。
|
6天前
|
存储 人工智能 弹性计算
AI计算加速渗透、基础设施全面升级…云栖大会重磅发布全览
AI计算加速渗透、基础设施全面升级…云栖大会重磅发布全览
|
4天前
|
存储 SQL 专有云
支持配置审计日志的存储数据库
审计日志作为企业监管平台的重要依据,同时也是“等保三级”认证的必要考察项之一。Dataphin V4.3版本支持设置平台日志的存储数据源,帮助用户快速获取审计日志,同时介绍了不同部署模式的Dataphin如何查看审计日志的方法。
|
7天前
|
分布式计算 DataWorks 调度
oss数据同步maxcompute报错
在使用阿里云DataWorks同步OSS数据至MaxCompute时,遇到“Input is not in the .gz format”的报错。问题源于目标目录中存在一个空文件,导致同步时识别错误。
|
3天前
|
数据挖掘 数据处理 索引
python 读取数据存为csv
在Python中,读取数据并将其保存为CSV(逗号分隔值)文件是一种常见的操作,特别适用于数据分析和数据科学领域。这里将展示如何使用Python的内置库`csv`和流行的数据处理库`pandas`来完成这项任务。 ### 使用`csv`模块 如果你正在处理的是简单的文本数据或者需要更低层次的控制,可以使用Python的`csv`模块。以下是一个基本示例,演示如何将数据写入CSV文件: ```python import csv # 假设这是你要写入CSV的数据 rows = [ ["Name", "Age", "City"], ["Alice", 24, "New Yor
57 35
|
6天前
|
开发框架 Dart Android开发
探索移动应用开发:从概念到实现
【8月更文挑战第52天】在这篇文章中,我们将一起踏上移动应用开发的旅程。从理解移动操作系统的基础知识,到掌握跨平台开发框架如Flutter的应用,文章将逐步引导你构建起自己的移动应用。我们将通过实际代码示例,展示如何利用Dart语言和Flutter框架快速开发一个具有“摇一摇”功能的简单应用。无论你是初学者还是希望扩展技能的开发者,这篇文章都将为你提供有价值的见解和实用的技能。
40 20
|
6天前
|
Linux
kickstart自动安装系统 --DHCP 配置及测试
PXE+Kickstart自动安装系统需配置DHCP服务器分配IP。dhcpd.conf示例:设置更新样式、忽略客户端更新、指定下一服务器及启动文件。定义子网、网关、掩码、动态地址池并预留特定MAC地址。重启xinetd、NFS、DHCP服务,确保新服务器与Kickstart服务器在同一网络,避免误装其他机器。注意隔离测试网络以防干扰生产环境。
42 18
|
4天前
|
机器学习/深度学习 人工智能 监控
低代码平台的崛起:开发的未来还是过渡阶段?
低代码平台通过可视化界面和预构建模块,让非技术用户也能快速开发应用,引起广泛关注。其兴起源于快速应用开发需求、技术人才短缺及业务与IT融合。然而,定制化限制、性能问题和依赖性是主要挑战。未来,低代码平台将提升技术成熟度,集成更多先进技术,并提供个性化服务,在软件开发中扮演更重要角色。
|
4天前
|
数据采集 机器学习/深度学习 算法
【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现
本文介绍了2024年“华为杯”中国研究生数学建模竞赛的选题分析,重点讨论了高速公路应急车道启用模型的问题。文章详细描述了如何使用YOLOv5和SORT算法进行车辆检测与跟踪,计算车流密度、流量及速度,并利用随机森林回归预测交通拥堵。此外,还提出了多情景动态分析和虚拟应急车道控制策略,以及优化数据采集点布置的方法。提供了完整的Python代码和B站视频教程链接,帮助读者深入理解并实践该模型。
75 6
【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现