zoukankan      html  css  js  c++  java
  • 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 } })
    
  • 相关阅读:
    Casperjs循环执行(重复执行不退出)
    casperjs批量执行多个url
    CasperJS API介绍
    phantomjs waitFor
    phantomjs 长图截屏
    Linux Shell函数
    全废话SQL Server统计信息(2)——统计信息基础
    JavaScript推断undefined的技巧
    Activity Test1
    Android触摸事件(五)-CropBitmapActivity关于裁剪工具的使用
  • 原文地址:https://www.cnblogs.com/endymion/p/9208342.html
Copyright © 2011-2022 走看看