大家好,我是苏日俪格,下面我把我对面向对象的理解跟大家分享一下,本文是面向对象的第一部分,本文纯属个人理解,有哪里不对的地方请在评论区指出,大家一起学习共同进步。
正所谓万物皆对象,从简单的整数到复杂的火箭都是对象,那么对象身上的属性和方法就可以看作是事物的特征和行为,就比如说色色的隔壁老王去开车,隔壁老王就是对象,色色的就是他身上的属性,而开车就是他的方法;下面来演示一个创建自定义对象最简明的方法:let obj = new Object(); // 创建一个obj对象
obj.name = '苏日俪格'; // 给obj对象添加它的属性
obj.show = function(){ // 给obj对象添加他的方法
console.log(this.name); // 苏日俪格
};
obj.show();
上面的例子用对象字面量语法可以写成这样的:let obj = {
name: '苏日俪格',
show: function(){
console.log(this.name); // 苏日俪格
}
};
obj.show();
下面我们说点深奥的东西,听不懂也没啥关系,这是我在面试的时候,面试官问我的问题,后来从书上网上多多少少看了点;ECMAScript中有两种属性:数据属性和访问器属性,这两个属性是我们JavaScript中底层的东西,也可以这么理解,对象的身上有属性,而数据属性和访问器属性就是用来描述属性行为的属性;
- 数据属性
数据属性是属性(property)的内部值,它包含一个数据值的位置,而在这个位置可以读取和写入值;数据属性有4个描述其行为的特征:
1、[[Configurable]]:表示能否通过delete将属性删除,能否把属性修改为访问器属性, 默认为true。当把属性Configurable设置为false后,该属性不能通过delete删除,并且也无法再将该属性的Configurable设置回true
2、[[Enumerable]]:表示属性可否被枚举(即是否可以通过for…in循环返回),默认true
3、[[Writable]]:能否修改属性值,默认为true
4、[[Value]]:包含这个属性的数据值,默认为undefined
以上面刚才的那个例子为例子,obj对象上有一个name属性,它的值是‘苏日俪格’,也就是[[Value]]的值就是‘苏日俪格’,对这个值做任何修改都可以反映在这个位置。
使用ES5的Object.defineProperty()方法可以修改属性默认的特性/描述符,接受三个参数:属性所在对象、属性的名字和描述符对象(谨记:描述符对象里面必须只能写那四种描述符),exp:let obj = {};
Object.defineProperty(obj, 'name', {
writable: false,
value: '苏日俪格'
});
console.log(obj.name); // 苏日俪格
obj.name = 'yufy';
console.log(obj.name); // 苏日俪格
例子中writable特征的值为false就是不能修改,之后再怎么修改都是无效的。
既然都可以修改了,肯定也是可以读取的,使用ES5的Object.getOwnPropertyDescriptor()方法可以读取属性的特征/描述符,他接受两个参数:属性所在对象和要读取描述符的属性名称,exp:let obj = {
name: '苏日俪格'
};
let gopd = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(gopd); // Object {value: "苏日俪格", writable: true, enumerable: true, configurable: true}
- 访问器属性
访问器属性不包含数据值;但他有一对getter和setter函数(不过这两个函数可有可无),在读取访问器属性时,会调用getter函数,返回一个有效值;在写入访问器属性时,会调用setter函数并传入新的值,该函数负责如何处理数据。访问器属性也具有四种特征/描述符对象:
1、[[Configurable]]:能否通过delete删除属性重新定义,或者能否修改为数据数据属性,默认为true
2、[[Enumerable]]:表示属性可否被枚举(即是否可以通过for in循环返回),默认true
3、[[Get]]:读取属性时调用的函数, 默认为undefined
4、[[Set]]:写入属性时调用的函数, 默认是undefined
至于访问器属性的用法和数据属性的类似,这里就不在强调了,接下来切入主题,玩面向对象先要搞定如何来创建对象
本文的所有内容均是一字一句敲上去的,希望大家阅读完本文可以有所收获,因为能力有限,掌握的知识也是不够全面,欢迎大家提出来一起分享!谢谢O(∩_∩)O~
欢迎访问我的GitHub,喜欢的可以star,项目随意fork,支持转载但要下标注,同时恭候:个人博客