关于Object

1. Array.isArray()

  • 作用:判断某个对象是否为数组
  • 使用:
  • Array.isArray(对象)
  • 返回值:布尔类型值
  • 注意:存在兼容性问题(ES5)

不使用该方法如何判断一个对象是否为数组?

插入介绍toString()方法的使用

    var o = {};
    var a ={};
    var b = {name:"张三"};

    o["a"] = "Test-a";
    o["b"] = "Test-b";
    o[b] = "Demo-b";
    o[a] = "Demo-a";

    console.log(o.a);      //Test-a
    console.log(o.b);      //Test-b
    console.log(o[a]);     //Demo-b
    console.log(o[b]);     //Demo-b
    console.log(o["a"]);   //Test-a
    console.log(o["b"]);   //Test-b

通过[]语法设置对象时的原则与注意点:

  1. []中存放的是字符串,那么这个字符串就直接作为key
  2. []中存放的不是字符串,那么就把[]中部分当成一个变量来处理,查找最近变量,获取其值
    2.1. 如果对应的值是字符串,那么就直接作为key
    2.2 如果对应的值是对象,那么就尝试把这个对象转换为字符串(toString)
  • toString():返回的事对当前对象的字符串描述。
  • object类型对象的toString: Object.prototype.toString(),返回[类型 构造函数](eg. [object Object])
  • 数组类型 toString: Array.prototype.toString(),返回数组元素值得字符串
  • 解决以上问题方法:返回true时则为数组,false则不是数组。
if(Array.isArray != 'function'){
      Array.isArray = function(obj){
            return Object.prototype.toString.call(obj) == "[object Array]";
      }
}

2. instanceof

  • 原理:检查该构造函数的原型对象是否在当前对象的原型链上面,如果在结果为true,如果不在结果为fasle。原型链详解

3. Object.prototype的部分方法属性

  1. constructor
  • 构造器属性:指向构造函数
  • 对象.constructor:该属性不是这个对象的实例属性,是其原型对象上的属性,指向创建该对象的构造函数。
  • 原型对象.constructor:该属性是这个原型对象的实例属性,指向与其相关联的构造函数。
  1. hasOwnProperty
  • 检查对象中是否存在某个指定的成员(仅仅检查实例属性)
  1. isPrototypeOf
  • 作用:判断对象是否是另一个对象的原型对象
  • 原型对象.isPrototypeOf(对象)。 注意点:检查整条原型链(原型链详解
  1. propertyIsEnumerable
  • 对象.propertyIsEnumerable(属性)
  • 检查对象的属性是否是可以被枚举。如果是可以枚举的,可以使用for..in循环遍历打印
  1. toLocaleString
  • 返回的是一个本地化字符串描述信息,大部分情况下同toString方法
  1. toString
  • 如果是object类型的对象,返回的是[object Object]
  • 如果是其他类型的对象,返回的是对应的字符串描述
  • 如果是Number类型调用,那么可以接受一个参数(几进制),如果参数不传递那么默认是10进制的
  1. valueOf(获得这个对象对应的值。)
  • 基本包装类型,返回对应的基本类型值。
  • 其他的对象,返回的是这个对象本身
  • 日期类型的对象,返回时间戳

4. Object的静态成员

  1. Object.apply(借用其他对象的方法)
  • 格式:对象1.方法.apply(对象2,[参数1,参数2..])
  1. Object.arguments(接收函数调用时候传入的实参)
  2. Object.assign(拷贝属性(一次性拷贝多个对象的属性))
  • 格式:Object.assign(目标对象,要拷贝属性的对象1,要拷贝属性的对象2...)
  1. Object.bind(绑定对象调用方法,同call和apply几乎是一样。)
  2. Object.call(同apply方法)
  • 对象1.方法.call(对象2,参数1,参数2..)
  1. Object.caller(调用者,谁调用当前的方法,那么就指向谁)
  2. Object.create(创建对象并且该对象的原型对象)
  • var o = Object.create(obj);//obj为新创建的对象o的原型对象
  1. Object.getOwnPropertyDescriptor(获取对象中某个属性的描述信息(描述对象))
  • 属性信息:
    • 该属性对应的值
    • 该属性是否是可枚举的enumerable
    • 该属性是否是可配置的configurable
      • 可配置的 该属性可以被删除,并且可以被修改为不可配置的
      • 不可配置的 该属性不可以被删除 并且不可以被修改为可配置的
    • 该属性是否是可重写的writable
  1. Object.getOwnPropertyDescriptors(获得对象中多个属性的描述信息)
  2. Object.defineProperty(设置对象中某个属性的描述信息(对象))
- 第一个参数:对象
- 第二个参数:属性
- 第三个参数:描述对象

注意点:
如果是已经存在的属性,在设置时省略不写,默认值全部都是true
如果是新增加一个属性,在设置时省略不写,默认值全部都是false

var o = {
        name:"小明",
        des:"描述信息"
    }
//console.log(Object.getOwnPropertyDescriptor(o, "name"));
    Object.defineProperty(o, "name",{
        configurable:true,   //删除属性,以及配置
        writable:true,        //重写属性  修改
        enumerable:false,
        value:"明明"
    });
  1. Object.getOwnPropertyNames(获得对象所有的实例属性名(key),返回值是一个数组,不论该属性是否是可枚举的,都可以获取
  2. Object.keys(获取所有的key)
- 不包含原型对象中的key
- 不能返回不可枚举的属性
  1. Object.getPrototypeOf(获取原型对象)
  2. Object.preventExtensions|Object.isExtensible
- 禁止对象扩展(不能给对象添加属性或者是方法)
  1. Object.seal
- (密封对象(对象不能添加成员 + 不能删除成员))
  1. Object.freeze
- 冻结对象(对象不能添加成员 + 不能删除成员 + 不能修改成员)

5. 函数内部的隐藏参数

  1. this (指向一个对象)(函数的调用方法会影响到函数内部this的指向)
    • 对象.方法 (以对象的方法来进行调用) this->对象本身
    • 以普通函数方式进行调用 this->window(非严格模式)
    • 以构造函数的方式调用 this->新创建的对象
    • 函数上下文call|apply this->绑定的第一个参数
  2. arguments(一个类似于数组的结构,用来接收函数调用时传入的实参。)
    • arguments.length:函数调用时候实际参数的个数
    • 函数.length:函数期望的形参个数

6. callee 和 caller

  1. callee
    • 返回正在执行的函数本身的引用,它是arguments的一个属性
    • 常用于递归
    • arguments.callee.length是形参的长度,arguments.length是实参的长度。
  2. caller
    • 返回一个函数的引用,该函数调用了当前函数
    • 注意:window来调用函数的时候,caller指向null而不是window

7. with

  • 作用:缩短代码
  • 使用:with(对象){} 在{}中可以通过无前缀的方式来操作对象的成员

注意点:

  1. this的指向->window
  2. 在{}中不能使用没有前缀的方式来添加成员,如果要添加成员必须要使用前缀
  3. 会破坏js代码的词法作用域,性能降低
  4. 严格模式下已经被禁止

你可能感兴趣的:(关于Object)