javaScript基础四

对象是javaScript的基本数据类型,对象可以看成多属性的无序集合,每个属性都是一个名/值对。也可以将对象看成从字符串到值的映射。因为属性名是字符串。

 

对象的创建  new  或者 Object.create()函数

 

prototype:原型。

所有的通过对象直接量创建的对象都具有同一个原型对象。并且可以通过Object.prototype 获得对原型对象的引用。

 

//传入所需的原型对象。

var o1=Object.create({x:1,y:2});

 

//创建一个空对象 

var o2=Object.create(null);//o2不继承任何的属性和方法,比如toString()  

 

//创建一个普通的空对象,就需要传入原型,Object.prototype;

var o3=Object.create(Obejcet.prototype);  这时候和{} 和new Object()一样。

 

var o={}  //o从Object.prototype继承对象的方法

o.x=1  //给o定义有一个属性x ,如果o有x属性,那么就是给他重新赋值,否则的话,就是重新添加新的属性。

var p=inherit(o) ;//p继承o和Obeject.prototype 这里的inherit()方法中不能传入null,这样的话就能继承Object的原型  并且能够继承对象o的x的属性。

 

如果对象的属性不存在的话 那么就返回undefined

 

使用delete的时候,只能删除自有属性,但是不能删除继承属性。

判断某个属性是否存在某个对象中,可以用in运算符,hasOwnPreperty()和propertyIsEnumerable()方法完成这个工作。

var o={x:1};

o.hasOwnProperty("x");  //true  但是对于继承属性 返回false 

"x" in o  //true  包括继承的属性

o.propertyIsEnumerable("x");//true  这是是hasOwnProperty("x")的加强版

o.x!==undefined  //true  这证明o中有属性x

但是如果定义的var o={o:undefined}

这时候只能用"x" in o来进行判断。

这里使用的!==null  因为如果是使用的!= 这时候必须判断x的值不为null 或undifined

 

//进行遍历对象的属性。使用for /in 循环遍历

    var o = {

        //普通的数据属性

      data_prop: "",

      //使用get set 这样的标记,就能直接把方法当做属性进行使用

      get accessor_prop() {

        return this.data_prop

      }, //这里不用;分割,而是选择使用,分割两个方法

      set accessor_prop(value) {

        this.data_prop = value

      }

    }

    console.log(o.accessor_prop)

    o.accessor_prop="eee"

    console.log(o.accessor_prop)

 

 

继承的写法

 

创建对象的时候 如果在属性中有$表示的就是私有的属性

 

 

创建对象中可以有多个get方法

 

可以通过Object.getOwnPropertyDescriptor({x:1},"x");

来获取到某个对象的特定属性的描述。但是只能获取到自身属性的描述符。想要获取到继承的属性的特性,需要遍历原型链。getProtorypeOf()

 

要想设置属性的特性,或者想让新建的属性具有某个特性,需要调用Object.definePeoperty(),传入要修改的对象/创建或修改的属性的名称以及属性的描述符对象。

但是如果想同时创建多个属性。就要使用Object.defineProperties()

 

数据属性的描述对象的属性 有value.  writable  enumerable configurable 

我们调用get set方法的时候直接像调用属性一样 就可以实现方法的调用。  这里提供get set 方法的目的 就是为了实现自定义方法的效果。

 

var  o={};//创建一个空的对象

//添加一个不可枚举的数据属性x 并赋值、

Object.defineProperty(o,"x",{

value:1,

writable:true.

enumerable:false,

configurable:true

});

因为是不可枚举的类型,那么 就调用Object.keys(o);//[]

这是定义一个get方法

Object.defineProperty(o,"x",{get:function(){return 0;}})

 

使用extend()函数,这个函数是把一个对象的属性复制到另一个对象中。仅仅是复制属性名和值,没有复制属性的特性。也没有复制getter  setter方法

 

对象的三个属性

原型(prototype)  类(class)  可扩展性(extensible attribute)

 

通过Object.create()创建的对象包含一个Constructor的属性,这个属性指代Object()构造函数。因此constructor.prototype才是对象直接量的真正原型。

//使用isPrototypeOf()

var p={x:1};

var o=Object.create(p);//这是以p为原型创建o的对象

p.isProtoTypeOf(o)  //true  

Object.prototype.isPrototypeOf(o)//true  :p继承自Object.prototype

 

通过classof()方法能够确定传入参数的类型

classof(null)  //null

classof(1)  //Number

 

对象的可扩展性  表示是否可以给对象添加新属性

Object.isExtensible(),//来判断该对象是否是可扩展的

如果想将对象转化为不可扩展的  需要调用object.preventEctensions()

但是一旦将对象转换为不可扩展的,就无法再转换为可扩展的了。

 

Object.seal() 和Object.preventEctensions()类似,除了能够将对象设置为不可扩展的,还可以将对对象的所有的自有属性设置为不可配置的。

 

可以通过Object.isSealed()来检测对象是否封闭

 

Object.freeze()  更严格的锁定对象。  Object.isFrozen()  检测

 

//创建一个封闭对象,包括一个冻结的原型,和一个不可枚举的属性

var o=Object.seal(Objecet.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));

 

对象的序列化:是将对象的状态转换为字符串。也可以将字符串还原为对象。

提供了JSON.stringify()  和JSON.parse()来序列化和还原javaScript对象

 

JSON.stringify() 只能序列化对象可枚举的自有属性。对于不能序列化的属性,在序列化的输出字符串中会将这个属性省略。

 

toString()方法,默认的情况携带的信息比较少,比如var s={x:1,y:1}.toString();//[object,object]  因此要进行重写toString()方法

 

对象都包括toLocaleString() 方法,这个方法返回的一个表示对象的本地化字符串。默认的toLocaleString()方法仅仅调用了toString()方法并返回。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值