[关闭]
@15152278073 2018-03-28T06:36:56.000000Z 字数 2751 阅读 608

理解JS中的对象

JS


JS中的对象可以看作是散列表:有键值对组成,值可以是数据或函数.每个对象都是基于一个引用类型创建,这个类型可以是原生类型,也可以是自定义的类型.

创建对象的属性和方法如下:

  1. //创建对象
  2. var person = new Object();
  3. person.name = "nick";
  4. person.age = 29;
  5. person.sayName = function(){
  6. console.log(this.name);
  7. }
  8. //更多的使用字面量创建对象
  9. var person ={
  10. name : "nick",
  11. age : 29,
  12. sayName : function(){
  13. return this.name;
  14. }
  15. }

属性类型

ECMA-262定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为JS引擎用的,JS中不能直接访问.为了表示这些是内部值,该规范把它们放在了两对方括号中,例如[[Enumerable]].

ECMAScript中有两种属性:数据属性和访问属性.

1.数据属性

数据属性包含一个数据值的位置.在这个位置可以读取和写入.数据属性有4个特性:
要修改属性的默认特性,必须使用Object.defineProperty()方法. 参考文档

对于前面的person对象,它的[[Configurable]],[[Enumerable]],[[Writable]]都为true,name属性的 [[Value]]特性被设置为"nick".对这个值的修改都将反应在这个位置.

  1. //Object.defineProperty()
  2. //Configurable Enumerable Writable默认都为false
  3. var o = {};
  4. Object.defineProperty(o,'a',{
  5. value:1
  6. })
  7. o.a = 2; //设置a的值,无效
  8. console.log(o.a); // 1
  9. delete o.a; //false
  10. for(let p in o){
  11. console.log(p) //empty
  12. }

2.访问器属性

访问器属性有四个.

访问器属性不能直接定义,必须使用Object.defineProperty()来定义.

  1. //访问器属性
  2. var book = {
  3. _year:2004,
  4. edition:1
  5. };
  6. Object.defineProperty(book,"year",{
  7. get:function(){return this._year; },
  8. set:function(newVar){
  9. this._year = newVar;
  10. this.edition += newVar - 2004;
  11. }
  12. })
  13. book.year = 2005;
  14. console.log(book.edition); //2

如果只指定getter意味着属性是只读的.严格模式下,写入getter属性会报错.如果只指定setter也不能读,非严格模式下返回undefined,在严格模式下返回错误.

另外有非标准的obj.__defineSetter__(prop, fun)obj.__defineGetter__(prop, func).该特性是非标准的,请尽量不要在生产环境中使用它!,且为已废弃状态

定义多个属性

由于定义多个属性的可能性很大,所以又定义了Object.defineProperties(obj, props)方法.

  1. //定义多个属性
  2. var book = {} ;
  3. Object.defineProperties(book,{
  4. _year:{
  5. writable : true, //可写
  6. value:2004
  7. },
  8. edition:{
  9. writable : true, //可写
  10. value:1
  11. },
  12. year:{
  13. get:function(){
  14. return this._year ;
  15. },
  16. set:function(newVar){
  17. if(newVar > 2004){
  18. this._year = newVar;
  19. this.edition += newVar - 2004;
  20. }
  21. }
  22. }
  23. })
  24. book.year = 2005;
  25. console.log(book.edition); //2

读取属性的特性

Object.getOwnPropertyDescriptor(obj, prop) 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

  1. var o, d;
  2. o = { get foo() { return 17; } };
  3. d = Object.getOwnPropertyDescriptor(o, "foo");
  4. // d {
  5. // configurable: true,
  6. // enumerable: true,
  7. // get: /*the getter function*/,
  8. // set: undefined
  9. // }
  10. o = { bar: 42 };
  11. d = Object.getOwnPropertyDescriptor(o, "bar");
  12. // d {
  13. // configurable: true,
  14. // enumerable: true,
  15. // value: 42,
  16. // writable: true
  17. // }
  18. o = {};
  19. Object.defineProperty(o, "baz", {
  20. value: 8675309,
  21. writable: false,
  22. enumerable: false
  23. });
  24. d = Object.getOwnPropertyDescriptor(o, "baz");
  25. // d {
  26. // value: 8675309,
  27. // writable: false,
  28. // enumerable: false,
  29. // configurable: false
  30. // }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注