怎么着晓得JavaScript的属性描述符,方法详解

By admin in 4858美高梅 on 2019年4月1日

Object.defineProperty()方法俗称属性拦截器,会一贯在叁个对象上定义七个新的质量,或修改三个对象共处的习性,并回到那一个目的。

怎样是性质描述符

成立一个指标最常用的措施是声称的款式,大约语法是这么的:

var myObj = {
  key : value
  //...
}

也得以运用构造样式,创制三个Object的实例,然后再为它添加属性和方法,差不多语法如下:

var myObj = new Object();
myObj.key = value;

在地方的例证中,两种创立方式创制的myObj是同样的,都有1致的个性和章程,那些属性在创立时都富含壹些特色值,JavaScript通过那么些特点值来定义它们的形为。ES5在概念只有在那之中才用的特性时,描述了品质的各个风味。这么些特点相当于性质描述符。

理解Object.defineProperty()

Object.defineProperty() 方法直接在一个目的上定义多个新属性,也许修改多少个业已存在的品质,
并再次回到那几个目的。

语法

  Object.defineProperty(obj, prop, descriptor)

品质描述符的三种样式

MDN中的描述:

对象里近来留存的特性描述符主要有三种格局:数据描述符和存取描述符。

  1. 多少描述符是1个持有可写或不足写值的个性。
  2. 存取描述符不含有数据值,是由壹对getter-setter函数功用来讲述的习性。
  3. 讲述符必须是三种样式之一;不能而且是五头。

**Object.defineProperty() 方法直接在三个目的上定义1个新属性,恐怕修改叁个业已存在的属性,
并重回这几个目的。**

语法

参数

  obj:要在其上定义的靶子

  prop:要定义或涂改的性能的名号

  descriptor:将被定义或改动的习性描述符

数量描述符具有以下四特性状:

  • ** [[configurable]] ** 暗中认可为false。当且仅当该属性的
    configurable
    为true时,该属性能够透过delete删除,该属性描述符才能够被改变,该属性描述符才能够被改为存取描述符。configurable重要针对属性描述符。直接在指标上定义的属性,它们的那些特点私下认可值为true。
  • [[enumerable]]默许为false。当且仅当该属性的 enumerable 为
    true 时,该属性才能够出今后对象的枚举属性中。那样就足以经过for…in
    循环再次回到属性。enumerable针对属性。直接在对象上定义的性格,它们的这些本性暗许值为true。
  • [[value]] 暗中同意为undefined。该属性对应的值。能够是其它有效的
    JavaScript
    值(数值,对象,函数等)。读取属性值时,从这几个岗位读;写入属性值时,把新值保存在这些职位。value针对品质。
  • [[writable]] 私下认可为false。当且仅当该属性的 writable 为 true
    时,该属性才能被赋值运算符更改。writable针对属性。直接在对象上定义的性质,它们的那性子子私下认可值为true。

平素在对象上定义的属性天性[[configurable]]、[[enumerable]]、[[writable]]都被安装为true,[[value]]被设置为对象该属性钦定的值。
比如:

var person = {
  name : "apple"
}

那里创办了二个名叫name的习性,为它钦赐的值是”apple”。也正是说,[[value]]特征将棉被服装置为”apple”,而针对性这些值的富有修改都在那个岗位上。

主干语法:Object.defineProperty(obj, prop, descriptor)
@param obj 【务必】目的对象
@param prop【必须】新增或修改的品质名字
@param descriptor 属性描述符。
品质描述符
包涵两种样式:数据描述符和存取描述符。数据描述符是四个拥有可写或不足写值的性情。存取描述符是由一对getter-setter函数功用来描述的性质。
只是该两者无法同时存在,描述符只可以是内部之一。

Object.defineProperty(obj, prop, descriptor)

返回值

  被传送给函数的靶子

  

4858美高梅 14858美高梅 2

var o = {
    values: 'hello'
}

Object.defineProperty(o, 'key', {
    value: 9,
    writable: true,
    enumerable: true,
    configurable: true
});

console.log(o.key) // 输出结果:9

console.log(o.values)   // 输出结果:hello

Object.defineProperty(o, 'values', {
    value: 'hello world',
    writable: true,
    enumerable: true,
    configurable: true
});

console.log(o.values)   // 输出结果:hello world

View Code

存取描述符具有以下5个特点:

  • ** [[configurable]] ** 暗中认可为false。当且仅当该属性的
    configurable
    为true时,该属性能够经过delete删除,该属性描述符才能够被转移,该属性描述符才可以被改为多少描述符。configurable首要针对属性描述符。直接在对象上定义的性质,它们的那个个性默许值为true。
  • [[enumerable]]暗中认可为false。当且仅当该属性的 enumerable 为
    true
    时,该属性才能够出现在对象的枚举属性中。enumerable针对属性。直接在对象上定义的本性,它们的那性子格默许值为true。
  • [[get]]暗中认可为undefined。在读取属性时调用的函数,3个给属性提供getter的方法,借使没有getter则为undefined。该方法再次回到值被用作属性值。
  • [[set]]默许为undefined。在写入属性时调用的函数,一个给属性提供setter的措施,假使未有setter则为undefined。该格局将经受唯1参数,并将该参数的新值分配给该属性。

1:数据描述符:
譬如如下三个日常对象:

怎么着晓得JavaScript的属性描述符,方法详解。参数

属性描述符

  对象里最近留存的个性描述符有三种重大方式:数码描述符存取描述符

  数据描述符:叁个存有值得属性,该值可能是可写的,也或者不是可写的。

  存取描述符:由getter和setter函数描述的性质。

  描述符必须是多头其1,不可能同时是相互。

数码描述符和存取描述符5个特点的比较:

  1. 三种描述符都有[[configurable]][[enumerable]]二种天性。默许值都为false;对于一贯在目标上定义的特性,默许值为true。
  2. 多少描述符其余全体[[writable]][[value]]三种性子;存取描述符别的全体[[get]][[set]]三种本性。
var obj = {
  "name": "kongzhi"
};
  • obj 要求定义属性的指标。
  • prop 需被定义或改动的属性名。
  • descriptor 需被定义或修改的性质的叙说符。

数据描述符

  configurable

    dang当且仅当该属性的configurable
为true时,该属性描述符才能够被改动,同时该属性也能从对应的指标上删除。默许为false。

  enumerable

    当且仅当该属性为true时,该属性才能够出现在目的的枚举属性中。默许为false。

  value

    该属性对应的值能够使别的有效的JavaScript值。暗中认可为undefined

  writable

    当该属性为true时,value才能被赋值运算符改变。私下认可为false。

4858美高梅 34858美高梅 4

var o = {
    values: 'hello'
}

Object.defineProperty(o, 'values', {
    writable: false,  // writable: false 赋值运算无法改变属性的值
    enumerable: false,  
    configurable: true
});

console.log(o.values)   // 结果:hello

o.values = 10;
console.log(o.values)   // 结果:hello

// enumerable: true 输出结果:values 
// enumerable: false 无输出
for(let key of Object.keys(o)){
    console.log(key)
}

View Code

4858美高梅 54858美高梅 6

var o = {
    values: 'hello'
}

Object.defineProperty(o, 'values', {
    writable: true,
    enumerable: true,  
    configurable: false
});


o.a = 1;
console.log(o)  // { values: 'hello', a: 1 }

delete o.a
console.log(o)  // { values: 'hello' }

delete o.values
console.log(o)  // { values: 'hello' }

View Code

操作属性描述符的办法

我们在开立1个对象时,平时境况下会在指标上一向定义属性,那样生成的特性的叙述符天性[[configurable]][[writable]][[enumerable]]值暗中同意为true。我们也得以运用ES伍提供的靶子方法来为指标创设属性,或修改对象共处属性的描述符。下边我们就来看一下那一个措施。

多少描述符属性如下:

描述

存取描述符

  存取描述符除了含蓄以上enumerable和configurable之外还有以下可选键值。

  get

    给2本性质提供getter的法门,要是未有getter则为undefined。当该属性被访问时,该方法会被实施,该措施执行时并未有参数字传送入,可是会传来this对象(由于再三再四关系,那里的this并不一定是该属性的指标)。暗中认可为undefined。

  set

    三个给属性提供 setter 的点子,固然未有 setter
则为 undefined。当属性值修改时,触发执行该措施。该措施将承受唯壹参数,即该属性新的参数值。暗中同意为undefined。

1. Object.defineProperty()

Object.defineProperty方法会直接在1个目的上定义一个新属性,或修改二个对象的依存属性,并赶回这一个指标

** 语法 **

Object.defineProperty(obj, prop, descriptor)

  • obj 供给定义属性的指标
  • prop 必要定义或改动的属性名称
  • descriptor 将被定义或修改的习性描述符对象
  • 回来值 被传给函数的对象

** 栗子 **

  1. 调用defineProperty方法添加数据描述符

var Obj = {}; // 创建一个新对象
// 对象Obj添加属性a,其值为37
Object.defineProperty(Obj, "a",{
  value: 37,
  writable: true,
  enumerable: true,
  configurable: true
});

image.png

  1. 调用defineProperty方法添加存取描述符

var myObj = {}; //创建一个新对象
var value;
Object.defineProperty(myObj, "b", {
  get : function(){
    return value;
  },
  set : function(newVal){
      value = newVal
  },
  enumerable : true,
  configurable : true
});
myObj.b = 38;
// 对象myObj拥有了属性b,值为38

image.png

  1. 数码描述符和存取描述符不可能混合使用

var hisObj = {}; //创建一个新对象
Object.defineProperty(hisObj,"c",{
  value: "50",
  get: function(){
    return "50";
  }
});
// 报错

image.png

Object.defineProperty(obj, "name", {
  configurable: true | false,
  enumerable: true | false,
  value: '任意类型的值',
  writable: true | false
});

该办法允许标准添加或涂改对象的质量。壹般景观下,大家为目的添加属性是由此赋值来创制并映以往性质枚举中(for…in 或Object.keys 方法),
但那种方法丰硕的属性值可以被改变,也能够被剔除。而利用 Object.defineProperty() 则允许改变那些额外细节的暗中同意设置。例如,暗中认可意况下,使用
Object.defineProperty() 扩张的属性值是不可改变的。

讲述符可同时具备的性质

  configurable enumerable value writable get set
数据描述符 yes yes yes yes no no
存取描述符 yes yes no no yes yes

假诺一个讲述符不富有value、writable、get和set任意一个珍视字,那么它将被认为是贰个数目描述符。固然还要具备value或writable和get或set关键字,将会生出非凡

4858美高梅 74858美高梅 8

var o = {
    values: 'hello'
}

Object.defineProperty(o, 'values', {
    writable: true,
    enumerable: true,  
    configurable: true,
    set(newval){
        o = newval
    }
});

o.values = 100;
console.log(o)

View Code

4858美高梅 9

mdn文档

2. Object.defineProperties()

Object.defineProperties方法直接在1个指标上定义新的属性或涂改现有属性,并回到该对象。

** 语法 **

Object.defineProperties(obj, props)

  • obj 须求添加或修改属性的对象
  • props 该指标的键值对定义对象的个性及质量相应的叙述符对象
  • 回到值 被传给函数的指标

应用方法与defineProperty类似,只可是defineProperties一回性能够安装两性情格的讲述符对象。

var  Obj = {
  "a":10
};
Object.defineProperties(Obj,{
  "a1":{
    get: function(){return this.a+1;},
    set: function(val){ this.a = val;}
  },
  "a2":{
    get: function(){return this.a+"test";},
    set: function(val){this.b = val}
  }
});
console.log(Obj.a1);
console.log(Obj.a2);
Obj.a1 = 3;
Obj.a2 = 'hello';
console.log(Obj.a1);
console.log(Obj.a2);

image.png

在动用getter和setter必要专注:假如目的钦赐了属性值,那么就不要针对该属性设置get和set,不然会招致堆栈溢出的报错。看下边包车型大巴板栗。

var  Obj = {
  "a":10
};
Object.defineProperties(Obj,{
  "a":{
    get: function(){return this.a+1;},
    set: function(val){ this.a = val;}
  }
});
console.log(Obj.a);

image.png

下边我们来精通下种种属性的意义:

目的里近来设有的习性描述符有三种重大情势: 
多少描述符和存取描述符

读取属性描述符的特性

4858美高梅,1. value:
意思: 属性的值,能够是任何类型的值,暗中同意为undefined

数据描述符是一个有着可写或不足写值的品质。存取描述符是由一对
getter-setter
函数作用来讲述的性质。描述符必须是二种样式之壹;不能而且是2者。

Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor()
重回钦点对象上三个自有属性对应的习性描述符。(自有属性指的是直接予以该指标的属性,不要求从原型链上进行查找的品质)
一经属性描述符是数据描述符,再次回到的对象的质量有configurable,
enumerable, writable, value;
如果属性描述符是存取描述符,重临的指标的质量有configurable,
enumerable, writable, value。

语法

Object.getOwnPropertyDescriptor(obj, prop)

  • obj 属性所在的靶子
  • prop 对象属性名称
  • 再次回到值 对象属性的讲述符对象

** 栗子 **

var book = {};
Object.defineProperties(book,{
  _year:{
    value: 2004
  },
  edition: {
    value: 1   
   },
  year:{
    get: function(){
      return this._year;
    },
    set: function(newVal){
      if(newVal > 2004){
        this._year = newVal;
        this.edition += newVal - 2004
      }
    }
  }
});
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
console.log(descriptor.value); // 2004
console.log(descriptor.configurable); // false
console.log(typeof descriptor.get); // undefined

var descriptor1 = Object.getOwnPropertyDescriptor(book,"year");
console.log(descriptor1.value); // undefined
console.log(descriptor1.enumerable); // false
console.log(typeof descriptor1.get); // 'function'

image.png

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global\_Objects/Object/defineProperty
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global\_Objects/Object/defineProperties
https://segmentfault.com/a/1190000003882976

1-1 不设置value属性
①般来说代码:

多少描述符和存取描述符均具有以下可选键值:

var obj = {};
Object.defineProperty(obj, "name", {});
console.log(obj.name); // undefined
  • configurable 仅当该属性的 configurable 为 true
    时,该属性才能够被改成,也能够被删去。默许为 false
  • enumerable 仅当该属性的 enumerable 为 true
    时,该属性才能够产出在目的的枚举属性中。暗中认可为 false
  • value 该属性对应的值。能够是此外有效的 JavaScript
    值(数值,对象,函数等)。默许为 undefined
  • writable 仅当仅当该属性的writable为 true
    时,该属性才能被赋值运算符改变。默认为 false
  • get 三个给属性提供 getter 的秘诀,要是未有 getter 则为
    undefined。该方法重回值被用作属性值。暗中认可为undefined
  • set 三个给属性提供 setter 的方法,借使未有 setter 则为
    undefined。该方法将收受唯一参数,并将该参数的新值分配给该属性。暗中同意为undefined。

    // 使用 proto
    Object.defineProperty(obj, “key”, {
    proto: null, // 未有继续的性质
    value: “static” // 未有 enumerable

                   // 没有 configurable
                   // 没有 writable
                   // 作为默认值
    

    });

    // 显式
    Object.defineProperty(obj, “key”, {
    enumerable: false,
    configurable: false,
    writable: false,
    value: “static”
    });

    // 循环利用同样对象
    function withValue(value) {
    var d = withValue.d || (

    withValue.d = {
      enumerable: false,
      writable: false,
      configurable: false,
      value: null
    }
    

    );
    d.value = value;
    return d;
    }
    // … 并且 …
    Object.defineProperty(obj, “key”, withValue(“static”));

    // 借使 freeze 可用, 幸免代码添加或删除对象原型的品质// (value, get, set, enumerable, writable, configurable)
    (Object.freeze||Object)(Object.prototype);

1-2 设置value属性

创办属性

若果目的中不设有钦赐的性格,Object.defineProperty()就创办这几个天性。当描述符中省略某个字段时,这几个字段将选用它们的私下认可值。拥有布尔值的字段的暗中认可值都是false。value,get和set字段的暗许值为undefined。定义属性时只要未有get/set/value/writable,那它被分门别类为多少描述符。

var o = {}; // 创建一个新对象

// Example of an object property added with defineProperty with a data property descriptor
Object.defineProperty(o, "a", {value : 37,
                               writable : true,
                               enumerable : true,
                               configurable : true});
// 对象o拥有了属性a,值为37

// Example of an object property added with defineProperty with an accessor property descriptor
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
                               set : function(newValue){ bValue = newValue; },
                               enumerable : true,
                               configurable : true});
o.b = 38;
// 对象o拥有了属性b,值为38

// The value of o.b is now always identical to bValue, unless o.b is redefined

// 数据描述符和存取描述符不能混合使用
Object.defineProperty(o, "conflict", { value: 0x9f91102, 
                                       get: function() { return 0xdeadbeef; } });
// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors
// 设置value 代码如下:
var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi"
});
console.log(obj.name); // kongzhi

修改属性

比方属性已经存在,Object.defineProperty()将尝试根据描述符中的值以及对象当前的安顿来修改那性子子。即使描述符的
configurable 个性为false(即该特性为non-configurable),那么除了
writable 外,其余特色都不可能被涂改,并且数据和存取描述符也无法相互切换。

设若贰个属性的 configurable 为 false,则其 writable 特性也不得不修改为
false。

假设尝试修改 non-configurable 属性性子(除 writable
以外),将会发生1个TypeError 非凡,除非当前值与修改值相同。

Writable 属性 
当属性特性(property attribute) writable 设置为false时,表示
non-writable,属性不能够被改动。修改三个 non-writable
的性格不会转移属性的值,同时也不会报极度。

var o = {}; // 创建一个新对象

Object.defineProperty(o, "a", { value : 37,
                                writable : false });

console.log(o.a); // 打印 37
o.a = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值)
console.log(o.a); // 打印 37, 赋值不起作用。

2. writable

Enumerable 特性

个性性情 enumerable 定义了目标的属性是还是不是能够在 for…in 循环和
Object.keys() 中被枚举。

var o = {};
Object.defineProperty(o, "a", { value : 1, enumerable:true });
Object.defineProperty(o, "b", { value : 2, enumerable:false });
Object.defineProperty(o, "c", { value : 3 }); // enumerable defaults to false
o.d = 4; // 如果使用直接赋值的方式创建对象的属性,则这个属性的enumerable为true

for (var i in o) {    
  console.log(i);  
}
// 打印 'a' 和 'd' (in undefined order)

Object.keys(o); // ["a", "d"]

o.propertyIsEnumerable('a'); // true
o.propertyIsEnumerable('b'); // false
o.propertyIsEnumerable('c'); // false

意义:属性的值是或不是足以被重写,true: 能够被重写,false:
无法被重写。暗中同意为false。

Configurable 特性

configurable 本性表示对象的属性是或不是能够被去除,以及除 writable
天性外的别样特色是或不是足以被修改。

var o = {};
Object.defineProperty(o, "a", { get : function(){return 1;}, 
                                configurable : false } );

// throws a TypeError
Object.defineProperty(o, "a", {configurable : true}); 
// throws a TypeError
Object.defineProperty(o, "a", {enumerable : true}); 
// throws a TypeError (set was undefined previously) 
Object.defineProperty(o, "a", {set : function(){}}); 
// throws a TypeError (even though the new get does exactly the same thing) 
Object.defineProperty(o, "a", {get : function(){return 1;}});
// throws a TypeError
Object.defineProperty(o, "a", {value : 12});

console.log(o.a); // logs 1
delete o.a; // Nothing happens
console.log(o.a); // logs 1

如若 o.a 的 configurable 天性已经为
true,未有不当会被抛出,并且属性会在结尾被删除。


二-1 writable设置为false,不可能重写,如下代码:

添加几特性格和默许值

思虑天性被赋予的私下认可脾性值分外重大,平时,使用点运算符和Object.defineProperty()为目的的性质赋值时,数据描述符中的属性默许值是例外的,如下例所示。

var o = {};

o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
  value : 1,
  writable : true,
  configurable : true,
  enumerable : true
});


// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
  value : 1,
  writable : false,
  configurable : false,
  enumerable : false
});
var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: false
});
// 先打印下值
console.log(obj.name); // kongzhi
// 更改值 
obj.name = "longen";
// 再打印下 
console.log(obj.name); // kongzhi

Setters 和 Getters

上面包车型客车事例表明了怎么样完毕本身存档的指标。当 temperature
属性设置时,archive 数组会获得1个 log。

function Archiver() {
  var temperature = null;
  var archive = [];

  Object.defineProperty(this, 'temperature', {
    get: function() {
      console.log('get!');
      return temperature;
    },
    set: function(value) {
      temperature = value;
      archive.push({ val: temperature });
    }
  });

  this.getArchive = function() { return archive; };
}

var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]

例2

var pattern = {
    get: function () {
        return 'I alway return this string,whatever you have assigned';
    },
    set: function () {
        this.myname = 'this is my name string';
    }
};


function TestDefineSetAndGet() {
    Object.defineProperty(this, 'myproperty', pattern);
}


var instance = new TestDefineSetAndGet();
instance.myproperty = 'test';

// 'I alway return this string,whatever you have assigned'
console.log(instance.myproperty);
// 'this is my name string'
console.log(instance.myname);

 

贰-贰 writable设置为true,能够被重写,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: true
});
// 先打印下值
console.log(obj.name); // kongzhi
// 更改值 
obj.name = "longen";
// 再打印下 
console.log(obj.name); // longen

3. enumerable

意思:该属性是还是不是能够被枚举(如:for..in 或 Object.keys()).
若是为true的话,能够被枚举,设置为false的话,不可能被枚举,暗中同意为false。

三-1 enumerable被安装为false,不可能被枚举,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: false,
  enumerable: false
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"}

// 再枚举对象的属性
for(var attr in obj) {
  console.log(attr); // 什么都没有输出 说明不能被枚举
}

三-贰 enumerable 设置为true,能够被枚举,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: false,
  enumerable: true
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"}

// 再枚举对象的属性
for(var attr in obj) {
  console.log(attr); // 输出 name
}

4. configurable

意思:是不是足以去除指标属性或是还是不是足以修改指标属性的风味。若是为true的话,可以被剔除或能够修改属性,为false的话,不能够去除指标属性或不可能改改目的属性,暗许为false

四-一 configurable: false,
为false的话,不可能去除目的属性或不可能修改目的属性。
正如代码:

var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: false,
  enumerable: false,
  configurable: false
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"}

// 删除属性 
delete obj.name;
// 重新打印下对象,看是否删除成功了
console.log(obj.name); // kongzhi

// 修改属性 
obj.name = "longen";
// 重新打印下对象,看是否修改成功了
console.log(obj.name); // kongzhi 

四-二 configurable: true, 能够去除指标属性 或
能够修改指标属性
,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
  value: "kongzhi",
  writable: false,
  enumerable: false,
  configurable: true
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"}

// 删除属性 
delete obj.name;
// 重新打印下对象,看是否删除成功了
console.log(obj.name); // undefined

// 修改属性 
obj.name = "longen";
// 重新打印下对象,看是否修改成功了
console.log(obj.name); // longen 

二: 存取器描述
动用存取器描述属性的时候,能够采用如下属性:

var obj = {};
Object.defineProperty(obj, "name", {
  enumerable: true | false,
  configurable: true | false,
  get: function() {} | undefined,
  set: function(value) {} | undefined
});

在意:当使用了getter或setter的时候,就不能够选取writable和value这两性格子。不然会报错。

getter 是得到属性值的格局。倘使未有getter 则暗中同意为
undefined,当大家读取有个别属性的时候,其实是在对象内部调用了该情势,该方式必须使用return语句,再次回到值被看作属性值。
setter
是安装属性的艺术。假诺未有setter,则私下认可为undefined,该措施接收二个参数,并将该参数值分配该属性。当我们设置有些属性的时候,实际上在对象的中间调用了该办法。

壹般来说代码是使用getter和setter的代码:

var obj = {};
var initValue = "kongzhi";
Object.defineProperty(obj, "name", {
  get: function() {
    // 当获取属性值的时候触发的函数
    return initValue;
  } ,
  set: function(value) {
    // 当设置值的时候触发的函数
    initValue = value;
  } 
});
// 获取值
console.log(obj.name); // kongzhi

// 设置值
obj.name = "longen";
// 打印下
console.log(obj.name); // longen

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有