JavaScript学习心得06

Object()

  1. 如果参数是各种原始类型的值,转换成对象就是原始类型值对应的包装对象:
var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true

var obj = Object(‘foo’);
obj instanceof Object // true
obj instanceof String // true

var obj = Object(true);
obj instanceof Object // true
obj instanceof Boolean // true
  1. 如果参数是一个对象,那么返回自身,不做任何改变:
//利用这一点,可以判断一个变量是否为对象
function isObject(value) {
  return value === Object(value);
}

isObject([]) // true
isObject(true) // false
  • 对于一般的对象来说,Object.keys()Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性Object.getOwnPropertyNames方法还返回不可枚举的属性名

如何计算对象属性的个数?

var obj = {
  p1: 123,
  p2: 456
};

Object.keys(obj).length // 2

Object之静态方法(本身的方法)分类

  1. 对象属性模型的相关方法;
  2. 控制对象状态的方法;
  3. 原型链方法。

Object.prototype.toString可以看出一个值到底是什么类型

Object.prototype.toString.call(2) // “[object Number]”
Object.prototype.toString.call(‘’) // “[object String]”
Object.prototype.toString.call(true) // “[object Boolean]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(Math) // “[object Math]”
Object.prototype.toString.call({}) // “[object Object]”
Object.prototype.toString.call([]) // “[object Array]”

属性描述对象attributes object

  • 有六个元属性,每一个对象的每一个属性都拥有一个属性描述对象:
  1. value:属性值;
  2. writable:是否可写?
  3. enumerable:是否可遍历?
  4. configurable:是否可配置该属性描述对象?
  5. get:每次读取该属性,都会调用这个取值函数。
  6. set
  • 注意,Object.getOwnPropertyDescriptor方法只能用于对象自身的属性,不能用于继承的属性。

  • 一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。

  • 如果对象的 JSON 格式输出要排除某些属性,就可以把这些属性的enumerable设为false。

configurable的爱恨情仇

  1. configurable为false时,valuewritableenumerable
    configurable都不能被修改了;
  2. configurable为false时, writable在false改为true会报错,true改为false是允许的;
  3. 只要 configurablewritable有一个是true,就可以通过Object.defineProperty方法来改value
  4. 但是当 configurable为false时,不能直接通过目标属性赋值来修改value
  5. configurable设为false时,该属性不能被删除;

如何写setter还有getter呢?

有两种写法:

  1. 传统的利用Object.defineProperty方法来修改setget
var obj = Object.defineProperty({}, ‘p’, {
  get: function () {
    return ‘getter’;
  },
  set: function (value) {
    console.log(‘setter: ‘ + value);
  }
});

obj.p // “getter”
obj.p = 123 // “setter: 123”
  1. 简化版本,应用更加广泛:
var obj = {
  get p() {
    return ‘getter’;
  },
  set p(value) {
    console.log(‘setter: ‘ + value);
  }
};

如何完美拷贝对象?(连原对象的属性描述对象都不放过~)

var extend = function (to, from) {
  for (var property in from) {
//过滤掉继承的属性,因为getOwnPropertyDescriptor读不出继承属性
    if (!from.hasOwnProperty(property)) continue;
    Object.defineProperty(
      to,
      property,
      Object.getOwnPropertyDescriptor(from, property)
    );
  }

  return to;
}

extend({}, { get a(){ return 1 } })
// { get a(){ return 1 } })

猜你喜欢

转载自www.cnblogs.com/endymion/p/9208342.html