初步了解javascript面向对象
引言
当我们谈及面向对象的语言时,一个显著的特征便是“类”的存在。类作为模板,为我们创建具有共同属性和方法的多个实例对象提供了基础。这些对象通常展现出封装、继承和多态的特性。在JavaScript(JS)这个看似面向对象的环境中,对象的定义与纯面向对象语言有所不同。在ECMAScript标准下,JS的对象是一组无序属性的集合,其属性可以包含基本值、对象或函数。
理解JS中的对象
创建对象的方式
在JS中,创建对象有多种方式。一种简单的方法是使用Object类的实例,然后为其添加属性和方法。例如:
```javascript
var person = new Object();
person.name = '谦龙';
person.sex = '男';
person.sayNameAndSex = function() {
console.log(this.name, this.sex);
}
person.sayNameAndSex(); // 输出:谦龙 男
```
另一种常见的方式是采用对象字面量的形式:
```javascript
var person = {
name: '谦龙',
sex: '男',
sayNameAndSex: function() {
console.log(this.name, this.sex);
}
}
person.sayNameAndSex(); // 输出:谦龙 男
```
属性的深入了解
在ECMAScript中,有两种主要的属性类型:数据属性和访问器属性。数据属性直接包含数据值,我们可以读取或写入这些值。而访问器属性则涉及到更复杂的行为,这里我们主要关注数据属性。
数据属性有四个描述其行为的特点:[[Configurable]]、[[Enumerable]]、[[Writable]]和[[Value]]。我们可以通过Object.defineProperty()方法来修改这些默认特性。例如:
```javascript
var person = {};
Object.defineProperty(person, 'name', {
configurable: false, // 禁止通过delete删除属性
enumerable: false, // 禁止通过for-in循环遍历该属性
value: '谦龙' // 设置该属性的值
});
// 尝试修改和删除属性均无效
person.name = '谦龙2';
delete person.name;
// 通过for-in循环无法获取该属性
for (var attr in person) {
console.log(person[attr]); // 无输出
}
console.log(person.name); // 输出:谦龙
```
需要注意的是,一旦将[[Configurable]]设置为false,就无法再修改为true。在调用Object.defineProperty()方法时,默认状态下[[Configurable]]、[[Enumerable]]、[[Writable]]均为false。这样的设计为我们提供了更为灵活和强大的对象操作方式。深入理解访问器属性及其特性
访问器属性是一种特殊的对象属性,它们并不直接存储数据值,而是通过getter和setter函数来管理和操作数据。这种属性设计允许我们在读取和写入属性值的时候执行自定义逻辑。访问器属性具有一些特定的特性,包括configurable、enumerable、get和set。
Configurable特性表示该属性是否可以通过delete操作符来删除并允许定义新的属性。Enumerable特性则决定了该属性是否可以通过for-in循环来遍历并返回属性。Get和set特性分别表示在读取和写入属性时的行为,它们可以是默认的undefined,也可以由我们自定义。值得注意的是,访问器属性不能直接定义,必须通过Object.defineProperty()方法定义。
以一个简单的例子来说明访问器属性的使用:假设我们有一个book对象,其中有一个私有属性_year和两个公开属性year和edition。我们通过Object.defineProperty()方法为book对象定义了一个访问器属性year,该属性通过getter和setter函数来操作私有属性_year和公开属性edition的值。当对year进行赋值操作时,会触发setter函数,该函数会检查新值是否大于当前_year的值,如果是,则更新_year的值并增加edition的值。
除了单个属性的定义,我们还可以使用ES5中的Object.defineProperties()方法来一次性定义多个属性。该方法接受两个参数:目标对象和包含要添加或修改的属性的描述符对象。在上面的例子中,我们使用Object.defineProperties()方法为book对象添加了_year、edition和year三个属性,并设置了相应的描述符。值得注意的是,writable属性必须设置为true才能允许属性的值被更改(默认是false)。
要获取对象属性的特性,可以使用ES5中的Object.getOwnPropertyDescriptor()方法。该方法接收两个参数:目标对象和要获取描述符的属性名称。通过该方法,我们可以获取给定属性的描述符对象,包括value(属性的值)、writable(是否可写)、configurable(是否可配置)和enumerable(是否可枚举)等特性。这对于理解和操作对象属性非常有帮助。
访问器属性提供了一种灵活的方式来管理和操作对象的属性值。通过理解其特性和使用方法,我们可以更好地利用这些属性来实现更复杂的功能和逻辑。深入解读JavaScript中的对象特性:属性描述与对象遍历
在JavaScript中,对象是一种复杂的数据结构,可以包含多种不同类型的属性。这些属性可以分为数据属性和访问器属性。当我们对一个对象进行操作时,经常会涉及到属性的配置和获取。接下来,让我们通过一个实例来详细了解这些概念。
假设我们有一个名为“book”的对象,通过`Object.defineProperties()`方法为其定义了几个属性。其中,`_year`和`edition`是数据属性,而`year`是访问器属性。
数据属性有configurable、enumerable、writable和value等属性。而访问器属性则包括configurable、enumerable、get和set。通过`Object.getOwnPropertyDescriptor()`方法,我们可以获取到这些属性的具体描述。
```javascript
var book = {};
Object.defineProperties(book, {
_year: {
value: 2015,
writable: true
},
edition: {
value: 1,
writable: true
},
year: {
get: function() {
return this._year;
},
set: function(value) {
var _year = this._year;
if (value > _year) {
this._year = value;
this.edition += value - _year;
}
}
}
});
```
接下来,我们通过一个函数`showAllProperties`来遍历对象的所有属性并打印出来。这有助于我们查看属性的具体信息。
狼蚁网站SEO优化的相关内容将在后续介绍,但在此我们先聚焦于对象的属性。当我们调用`Object.getOwnPropertyDescriptor(book,'_year')`和`Object.getOwnPropertyDescriptor(book,'year')`时,我们分别获取到数据属性`_year`和访问器属性`year`的描述信息。之后,通过`showAllProperties`函数展示这些属性的详细信息。
我们看到代码中有一行 `cambrian.render('body')`,这似乎是对某个库或框架的调用,用于渲染页面或组件。但这并非JavaScript面向对象编程的核心内容,因此在此不做过多解释。理解JavaScript中的对象属性和其工作方式对于开发高效、可维护的代码至关重要。随着我们对这些内容的深入理解,我们将能够更好地操控和操作对象,编写出更强大的JavaScript应用。
长沙网站设计
- 初步了解javascript面向对象
- ajax上传多图到php服务器的方法
- 微信开发之网页授权获取用户信息(二)
- thinkphp5.0整合phpsocketio完整攻略(绕坑)
- 你或许不知道的一些npm实用技巧
- DOM 事件的深入浅出(二)
- 解决PHP超大文件下载,断点续传下载的方法详解
- jquery+php随机生成红包金额数量代码分享
- CodeMirror js代码加亮使用总结
- 充分发挥Node.js程序性能的一些方法介绍
- ThinkPHP连接数据库操作示例【基于DSN方式和数组传
- 详解PHP后期静态绑定分析与应用
- 微信小程序 教程之wxapp视图容器 swiper
- AJAX提交表单数据实例分析
- AngularJs Modules详解及示例代码
- JavaScript知识点总结(四)之逻辑OR运算符详解