我们先创建一个对象:

var person = {
  name:
"Nicholas",
  _job:
"Software Engineer",
  sayName:
function(){
    alert(
this.name);
  },
  get job(){
return this._job;
},
  set job(newJob){
this._job=newJob;
}
}

在这个对象中,我们定义了一个name属性和一个_job属性;至于以set和get开头的两处代码,他们共同定义了一个属性job。明显属性job和_job、name的是不同的,是的,JavaScript中的对象有两种不同类型的属性:数据属性和访问器属性。

name和_job是数据属性,job是访问器。数据属性和访问器属性的最大的不同就在于:当访问一个一个访问器属性时,得到get后面函数的返回值;给一个访问器属性赋值时,执行的是set后面的函数,这个函数以将要赋的值为参数:

console.info(person.job);//Software Engineer
person.job="Coder";
console.info(person.job);
//Coder
console.info(person._job);//Coder

在set函数中我们通过this改变了_job的值(this指向person这个对象);

在了解了对象属性的类型后,我们再来看看对象属性描述符。每个对象的属性在创建是都带有一些特征值(用描述符表示),JavaScript通过这些特征值来定义它们的行为。

我们在创建person对象时没有为它的属性们指定描述符,但是它们都具有默认的属性描述符。属性的描述符通过Object.getOwnPropertyDescriptors()得到:

var descriptors= Object.getOwnPropertyDescriptors(person)
//descriptors的内容如下;
{
age:{value:
29, writable: true, enumerable: true, configurable: true}
job:{enumerable:
true, configurable: true, get: ƒ, set: ƒ}
name:{value:
"Nicholas", writable: true, enumerable: true, configurable: true}
sayName:{writable:
true, enumerable: true, configurable: true, value: ƒ}
_job:{value:
"Coder", writable: true, enumerable: true, configurable: true}
}

我们可以看到descriptors是一个对象,对象的键是所描述的对象的属性,值就是属性描述对象。我们挑前两个看看,正好是不同类型的属性:一个数据属性,一个访问器属性。我们可以看到数据属性的描述符对象有四个属性:value,writable enumerable ,configurable ;访问器属性的描述符对象也有四个属性:enumerable ,configurable,get,set ;

——————未完待续————————

更多相关文章

  1. JavaScript:使用函数参数检索javascript对象键
  2. javascripterror 为空或不是对象.
  3. JavaScript中的数学对象中的方法
  4. Javascript知识汇总------面向对象中继承(未完成)
  5. JS面向对象写法
  6. JavaScript 对象及初识面向对象
  7. 第三节(JavaScript 对象、日期,函数)
  8. 使用jackson json将属性添加到json字符串
  9. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,

随机推荐

  1. android 分隔线
  2. EditText小总结
  3. 【Android】Android 代码判断是否获取ROO
  4. Android Gradle 编译问题汇总
  5. Android SDK大连东软镜像地址及地址列表
  6. android manifest.xml中元素含义android
  7. 详解android:scaleType属性
  8. Android PagerTabStrip和PagerTitleStrip
  9. 最新Android ADT, SDK, SDK_tool等官方下
  10. [Android]"@string/hello"和"你好"的区别