面向对象的Javascript

本文介绍了JavaScript面向对象编程的多种实现方式,包括简单的对象创建、使用JSON、类定义、原型及综合方法等。每种方法均有详细的示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Javascript虽然称不上一种严格意义上的面向对象语言,例如没有像PHP,C++那样提供class关键字。但在Javascript中所有的东西都是一个对象,除了一些内置的原语(如nullundefined),这样的特性使其能很方便的进行面向对象的开发,同样也使其面向对象的实现方式具有多样性。

对象的创建

1. 简单的对象创建

使用Object,创建Object的实例,然后向其中添加内容。Object是Javascript中所有对象的基类。

复制代码
var newObject = new Object(); //创建实例
newObject.firstName = "frank"; //添加firstName属性
//添加sayName方法
newObject.sayName = function() {
  alert(this.firstName);
}
复制代码

在Javascript中,不必为一个对象实例创建类或模板,可以像上例所示那样直接创建对象实例,并且可以在任何时候给该对象实例添加属性和方法。

事实上,Javascript的实现只是把所有的对象当做关联数组。然后给数组加上了一个面具,使它的语法看起来更像Java或C++,使用点分隔表示方法。但实际上任然可以用获取数组元素的方式取得对象中的元素。

var name = newObject["firstName"];
newObject["sayName"]();

这个简单的东西可以算是很多强大功能的基础。比如,依据某种逻辑调用某个对象的方法:

复制代码
function sayLoudly(){
    alert(this.firstName.toUpperCase());
}

newObject.sayLoudly = sayLoudly;

var whatVolume = 2;
var whatFunction;
if (whatVolume == 1) {
    whatFunction = "sayName";
}else if (whatVolume == 2) {
    whatFunction = "sayLoudly";
};

newObject[whatFunction](); 
复制代码

 

根据whatVolume的值可以调用对象中不同的方法,在上述代码中对象sayLoudly方法的添加,体现了向一个对象添加函数的时候,可以使用已存在的函数。sayLoudly函数中this所指向的对象将会在运行时动态计算,不同对象调用时其所指向也就不同。这种运行时绑定也是Javascript面向对象实现的一个非常强大的特性,它允许代码的共享,本质上来说,是一种继承的形式。

2. 使用JSON创建对象

因Javascript里的对象实质是关联数组,所以使得使用JSON创建对象的方法可行。

复制代码
var newObject = {
    firstName = "Ljhero",
    sayName: function() {
          alert(this.firstName);
      },
    sayLoudly: sayLoudly
};
复制代码

 

使用JSON定义和定义一个数组非常相似,除了使用花括号而不是方括号,函数可以是内联的,也可以是外部函数。在JSON中,可以随意地嵌套对象定义来创建对象的层级关系。例如:

复制代码
var newObject = {
    firstName = "Ljhero",
    sayName: function() {
          alert(this.firstName);
      },
    sayLoudly: sayLoudly,
    LastName: {
        lastname: "LJHERO",
        sayName: function() {alert(this.lastname);}
    }
};

newObject.LastName.sayName();
复制代码

 

3. 使用类的定义

在Javascript中,函数也是一个对象,故可以把一个函数当做类的构造函数来提供服务。这样就可以很方便的创建类的多个实例对象。

复制代码
function Person(name){
    this.name = name;
    this.sayName = function(){
        alert(this.name);
    }
}

var one = new Person("ljhero");
one.sayName();

var two = new Person("LJHERO");
two.sayName();
复制代码

 

在定义Person类之后,其后创建的实例对象onetwo都具有相同的属性和方法。但是由此引出的一个问题是,Person类的每个实例都含有name的一个副本和sayName()方法的一个副本,那么每个实例占用了更多的内存。如果所有的实例能共享sayName()这样相同的副本的话,就能节省些内存。随后介绍的prototype就是这样的方法。

4. 原型

Javascript中的每一个独立的对象都有一个与之关联的原型(prototype)属性,可以看作一个简化的继承形式。其工作方式是:当你构造一个对象的新实例时,定义在对象原型中的所有属性和方法,在运行时都会附着在那个新的实例上。

复制代码
function Person(name){
    this.name = name;
}

Person.prototype.sayName = function(){
        alert(this.name);
};

var p = new Person("ljhero");
p.sayName();
复制代码

 

这样无论创建多少个Person实例,在内存中sayName()函数只会有一个单独的实例。这个方法实际上是附加在每个实例上,而且this关键字也是在运行时绑定,跟方法1中sayLoudly函数相同。

5. 综合方法

程序员们在研究Javascript如何实现面向对象的过程中,做了很多探索,提出了新的定义Javascript类的方法,阮一峰老师在Javascript定义类的三种方法一文中总结出了三种方法:

  • 构造函数法

其实质就是上面提到的原型方法。

  • Object.create()法

这是运用了Javascript的国际标准ECMAScript第五版(目前通行的是第三版),提出的一个新的方法Object.create()。

复制代码
var Person = {
    name: "ljhero",
    sayName: function(){
        alert(this.name);
    }
};

var p = Object.create(Person);
p.sayName();
复制代码

 

  • 极简主义法

这是作者所推荐的方法,它巧妙方式实现对类的全面的模拟,封装,继承,私有属性和私有方法,实例间的数据共享都能实现。

方法的选择

方法1和2,都是创建单个的实例对象,也就是说如果你想创建相似的对象,就得重新编写相同的创建实例代码。如果想要创建一个类,这个类非常大,而且可能有很多复杂的实例,那么使用原型方法是最佳的选择,能带来最好的内存使用效率。当然如果想要实现完全的面向对象编程,极简主义法可以满足你的要求。 如果你的对象层级关系嵌套层次很多或你需要一个动态方式中定义一个对象,那么JSON方法将是一个好的选择。如果需要将对象序列化并且通过网络进行传输,JSON也几乎非常明显是首选。JSON方式也很方便重构一个从服务器传送来的对象。例如:

var res = '{name:"ljhero",sayName: function() {alert(this.name);}}';

var p = eval('('+res+')');
p.sayName();

 

需要注意的是eval在执行JSON格式字符串时,要多加一个括号,这是因为{}在Javascript首先是被当做代码块执行,加括号避免出现这种错误

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了`MPU6050`,该包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值