龙空技术网

WPS宏(JSA)教程——为对象的属性和方法的相关操作

Wps-Excel解决方案 168

前言:

现时大家对“js 给对象添加属性 什么方法比较好”可能比较着重,看官们都需要剖析一些“js 给对象添加属性 什么方法比较好”的相关知识。那么小编在网摘上收集了一些对于“js 给对象添加属性 什么方法比较好””的相关文章,希望我们能喜欢,小伙伴们快快来了解一下吧!

我们在前面的章节中讲述过:我们可以随时给某一个对象添加新的属性,但此时,该属性绑定的是这一个对象。并不影响其他由同一个对象类型创建的对象。那么,如果我们后来想给对象类型动态地添加属性,从而影响所有由该对象类型衍生的对象实例呢?

今天我们就来了解这一部分内容。

一、为对象类型添加属性

假定我们定义了一个车类型的设备的对象类型:

//定义一个对象类型CarDevicefunction CarDevice(driver){  this.wheels = 4;  this.color = '黑色';  this.engine = '内燃机';  this.displacement = '4.0';//排量  this.driverNum = 1;  this.maxPassengerNum = 4;  this.maxSpeed = 300;  this.driver = driver;} //再给这个车类设备定义一个喇叭鸣叫的方法,//这台车目前移动功能还在开发中,只能叫不能跑。CarDevice.prototype.beep = function(){  console.log(`司机${this.driver},按下了喇叭,汽车发出了“滴滴的声音”。`);}//创建一个对象出来;var HongQi_H5 = new CarDevice('李雷');//红旗H5被创建出来了//但是这台车的排量没这么大,我们现在把它的排量改一下HongQi_H5.displacement = '1.8';//晚上坐上了车,突然发现车子还需要一个属性,比如车灯的类型:是LED的还是卤素,不光这台红旗//需要这么一个属性,以后所有车子都会要。于是我们就给车子的对象类型添加属性CarDevice.prototype.lightType = 'LED';//所有车都有灯的属性,还是LED灯//但是我们发现红旗h5是卤素灯,不是LED的。HongQi_H5.lightType = 'Halogen';console.log(HongQi_H5.lightType);console.log(HongQi_H5.driver);HongQi_H5.beep();

通过上面的示例我们发现:无论某个对象实例是否已经创建,通过在对象原型上添加的属性,将会影响所有对象,无论对象是在此属性添加之前实例化还是之后实例化的,都会受到影响。

二、给对象定义方法

什么是方法?方法的本质是对象的一个具名化的属性的值,只不过这个值有点特殊,它是一个函数。

例如,苹果15作为一个对象。

var iphone15 = {    属性1: 值1,    属性2: 值2,    ...    方法1: function(参数列表){      函数语句    },  //我们还可以这样写  方法2(参数列表)  {    函数语句  }}

从上面的例子中,我们可看出给对象定义方法的语法如下:

//一、给已经存在的对象添加方法和属性对象名称.方法名称 = 函数名称//对象名称:这个对象必须是已经存在的具体实例//在对象定义时的定义方法和属性var objs = {  methodName: function(params){    语句...  }  //或者  methodName(){    语句...  }}//当我们要调用方法的时候  对象名称.方法名称(参数列表)

再举个当对象已经存在再给他添加方法的栗子,以帮助大家消化

//上面的汽车HongQi_H5现在还不能跑,我们现在给它定义一个跑的方法  function run(){    str=`${this.driver}踩下油门,车子一溜烟跑了。`;    return str;  }HongQi_H5.run = run;//当我们要调用的时候console.log(HongQi_H5.run());

对象在定义的时候给其定义方法:

var iphone15 = {  call: function(num){//格式一    str = `给${num}打电话`;    return str;  },  sendMessage(num){//格式二    str = `给${num}发短信`;    return str;  },}console.log(iphone15.call('1334455667'));console.log(iphone15.sendMessage('1334455667'));
三、关于this的指代

在前面的代码中,我们多次看到this这个词,后面跟着小圆点跟着对象的属性或方法。

如果将对象类型当作一个模板,那么代码中的this,指代的就是这个模板本身。

哪个对象或者对象类型的代码中出现了this,那么这个this就指代的是谁。

四、定义getter和setter

getter:是一个获取某个特定属性的值的方法。

setter:是一个设定某个属性的值的方法。

我们可以为预定义的用户定义的对象定义 getter 和 setter 以支持新增的属性。

使用getter和setter定义的属性是一种伪属性,一般有两种方式为对象定义属性。

第一种:通过对象初始化器进行定义,下面的示例演示的是getter和setter是如何通过对象初始化器进行定义的。

var phone = {  color:'green',  get pcolor(){//pcolor是一个伪属性。    return this.color;  },  set pcolor(v){//setter和getter可以同时设置为同一个伪属性名称。    if(this.color!=v) this.color= v  }}phone.pcolor = 'golden';console.log(phone.pcolor);//goldenconsole.log(phone.color);//golden

由以上的示例,我们可以看到通过对象初始化器进行定义的setter和getter,其语法为:

对象名称 = {  对象属性1: 属性值1,  get 属性名(){    语句  },  set 属性名(参数){    语句  }}

第二种: 通过静态方法Object.defineProperties 对一个已经存在的对象添加getter和setter方法。

let myObj = {};//空对象let tempName;Object.defineProperty(myObj,'name',{  get (){    return tempName;  },  set (value){    tempName = value;  },  enumerable: true,  configurable: true,})myObj.name = 'hello';console.log(myObj.name);//helloconsole.log(tempName);//hello,这说明属性添加成功了,因为经过了中间变量的数据传递。

不难看到,上面这种方法的语法

Object.defineProperty(对象名称, 属性名称, 属性描述符)

属性描述符有两种形式:

1、数据描述符:这种是指一个属性有value,和writable这种描述形式。

value: 属性的值,可以是任何值,默认情况下是undefined

writable:属性的值是否可被写。默认情况下是false,不可写。

2、访问描述符:这种是指一个属性有set和get这种描述形式。

get:用作属性 getter 的函数,如果没有 getter 则为 undefined。当访问该属性时,返回值将被用作该属性的值。默认值为 undefined。

set:用作属性 setter 的函数,如果没有 setter 则为 undefined。当该属性被赋值时,将调用此函数,设置该属性的值。默认值为 undefined。

以上这两种描述形式无法同时存在:就是说,你无法在一个属性拥有Value和writable的同时,再定义上getter和setter。

但是它们都共享有以下共同的可选项:

1、configurable:该可先项所代表的含义是:该属性是否可在数据属性和访问器属性之间进行切换;该属性是否要以被删除;其他属性是否可被更改。

其默认值是false,代表的意义是:

a、该属性的类型不能在数据属性和访问器属性之间更改;

b、该属性不可被删除

c、其描述符的其他属性也不能被更改(但是,如果它是一个可写的数据描述符,则 value 可以被更改,writable 可以更改为 false)。

2、enumerable:该属性是否可被枚举。值为 true时代表该属性可以被枚举。默认值为 false,该属性不可被枚举。

五、删除属性

通过delete操作来删除一个不是继续过来的属性,如果对象的属性不是自有的,而是从其对象原型继承而来的,则无法被删除。其语法如下:

let myObj = {};//空对象let tempName;Object.defineProperty(myObj,'name',{  get (){    return tempName;  },  set (value){    tempName = value;  },  enumerable: true,  configurable: true,})myObj.name = 'hello';console.log(myObj.name);//helloconsole.log(tempName);//hello,这说明属性添加成功了,因为经过了中间变量的数据传递。delete myObj.name; //删除name属性console.log(myObj.name);//undefined,该属性不存在,被删除了。
关注我,持续共同学习,一起踏上wps宏(JSA)的登山之路。

标签: #js 给对象添加属性 什么方法比较好 #js 给对象添加属性 什么方法比较好用