面向对象的程序设计 <step 1 ~ 对象的属性>

大家好,我是苏日俪格,下面我把我对面向对象的理解跟大家分享一下,本文是面向对象的第一部分,本文纯属个人理解,有哪里不对的地方请在评论区指出,大家一起学习共同进步。

正所谓万物皆对象,从简单的整数到复杂的火箭都是对象,那么对象身上的属性和方法就可以看作是事物的特征和行为,就比如说色色的隔壁老王去开车,隔壁老王就是对象,色色的就是他身上的属性,而开车就是他的方法;下面来演示一个创建自定义对象最简明的方法:

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~

我的简书:https://www.jianshu.com/u/72f239ec5d03
等一下( •́ .̫ •̀ ),我还有最后一句话:
我爱你,
我喝过最烈的酒 ,
是你在骄阳下的不回头,
吃过最苦涩的春药 ,
是你和我说 ,
可绝不在你启程时 ,
要一世白头 ,
再见...

原文地址:https://www.cnblogs.com/yufy/p/9354822.html