zoukankan      html  css  js  c++  java
  • 面向对象的程序设计 <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
    等一下( •́ .̫ •̀ ),我还有最后一句话:
    我爱你,
    我喝过最烈的酒 ,
    是你在骄阳下的不回头,
    吃过最苦涩的春药 ,
    是你和我说 ,
    可绝不在你启程时 ,
    要一世白头 ,
    再见...

  • 相关阅读:
    Linq to DataTable 左连接
    关于值类型和引用类型
    静态页生成
    技术是什么?
    关于GC垃圾回收的原理
    ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
    Unity3d连接SQL Server数据库出现SocketException: 使用了与请求的协议不兼容的地址错误
    JAVA/GUI程序之记事本
    面试常见题
    unsafe
  • 原文地址:https://www.cnblogs.com/yufy/p/9354822.html
Copyright © 2011-2022 走看看