JavaScript 对象属性与方法

对象的创建:

1 字面量创建
    var obj = {a:1,b:2};
构造函数创建
    var obj = new Object();
    obj.a = 1;
    obj.b = 2;    

3 Object.create(targetObj):根据已有对象创建

  • 使用已有对象提供新对象的原型链,现有对象会将targetObj作为自己的原型链
  • 返回一个新对象,带着指定的原型对象和属性
  • 该方法可以用于实现类的继承
    var span = document.createElement("span");
    span.k = "extends!";
    var obj1 = Object.create(span);
    // console.dir(obj1.__proto__.k);//extends!
    console.dir(obj1.__proto__);//span
    console.log(obj1.prototype);//undefined
    console.log(obj1 === span);//false,返回的是新对象

Object.assign 对象浅复制

Object.assign(targetObj,sourceObj1,sourceObj2......);

该方法用于将一个或多个源对象的属性拷贝(浅复制)到目标对象,返回目标对象。

  • 只能复制对象属性,不能复制对象的原型链属性
  • 只能复制可枚举类型
  • 引用关系也会一同被复制,只能浅复制
  • 多个源对象复制时,如果有相同的属性,后面的将会覆盖前面的
  • 复制属性定义应当使用Object.getOwnPropertyDescriptor()和Object.defineProperty()
  • String和Symbol类型也会被拷贝,undefined和null可以被拷贝不报错
  • IE不支持该方法,需要考虑兼容
        var t = {x:1}
        var obj = {a:1,b:null,c:undefined,d:t}
        var obj2 = Object.assign({},obj);
        console.log(obj2);//可以复制null
        obj2.d.x = 1000;
        console.log(t.x);//1000,浅复制,存在引用    

Object.assign与Object.create

assign:复目标对象属性给自身,包括原型

create:将目标对象作为自己的原型

        var span = {};
        span.t = "get prop!";
        span.__proto__.x = "get prop!";
        var obj = Object.create(span);
        var obj1 = Object.assign({},span);
        console.log("create:",obj);
        console.log("assign:",obj1);    

扫描二维码关注公众号,回复: 9335668 查看本文章

Object.defineProperty(obj,property,propObj)

        var obj = {_b:1};
        Object.defineProperty(obj,"a",{
            configurable:false,//是否可删除属性并且重定义描述对象
            enumerable:false,//是否可枚举,比如for循环和Object.keys
            writable:false,//是否可更改(改的话不会报错但是改不了)
            value:10
        });
        // obj.a = 1000;
        // console.log(obj.a);//10,不可更改
        // console.log(Object.keys(obj));//没有a,不可枚举
        for ( var key in obj) {
            console.dir(key);//没有a,不可枚举
        }
        delete obj.a;
        console.log(obj.a);//不可删除    
 以上四个属性在不显式调用Object.defineProperty()的时候,
    前三个默认值都为true,而value为你自己设定的值,如果不设定的话则为undefined。一旦用defineProperty设置,前三个默认为false
 原型链属性不可被修改描述对象
  

Object.defineProperties(obj,{prop1:{},prop2:{}......})

  • 该方法用于为一个对象定义多个描述对象Object.defineProperties(obj,{prop1:{},prop2:{}......})

Object.getOwnPropertyNames(obj)

  • 该方法用于获取对象的全部属性名称组成的数组,并返回该数组

Object.getOwnPropertyDescriptor(obj,prop)

  • 该方法用于获取对象某个属性的描述对象,并返回该对象

obj.propertyIsEnumerable(prop)

  • 该方法用于判断对象是否包含某个属性,返回布尔值

obj.isPrototypeOf(o)

  • obj是否是o的原型
  • 或者obj类是否是o的父类

Object.frozen(obj)

  • 冻结对象,不能删除与重置属性,不能重置属性的描述对象
  • 不能被Object.create()增加冻结的对象属性
  • 可以被Obejct.assign()复制,并且复制之后的属性可删除和修改

Object.is()

判断,等同于===,但是有几个例外情况

console.log(NaN === NaN);//false
console.log(Object.is(NaN,NaN));//true
 

猜你喜欢

转载自www.cnblogs.com/ltfxy/p/12343917.html