资讯专栏INFORMATION COLUMN

JavaScript 之 面向对象 [ Object类型 ]

reclay / 3284人阅读

摘要:类型描述类型对象是所有其他类型对象的父级使用创建对象表示使用构造函数方式创建一个空对象显示可以根据一个给定值创建一个对应类型的对象创建一个类型的对象显示啊哈哈创建一个类型的对象显示啊哈哈属性描述符表示对象的属性或方法的内部数据结构用于描述对

Object类型 描述

object类型对象是所有其他类型对象的父级

使用Object创建对象
/* 表示使用构造函数方式创建一个空对象 */
var obj1 = new Object();
console.log( obj1 );// 显示 {}


/* Object可以根据一个给定值创建一个对应类型的对象 */
var obj2 = new Object( 100 );// 创建一个number类型的对象
console.log( obj2 );// 显示 [Number: 100]
var obj3 = new Object( "啊哈哈" );// 创建一个string类型的对象
console.log( obj3 );// 显示 [String: "啊哈哈"]
属性描述符

表示对象的属性或方法的内部数据结构

用于描述对象的值,或控制值的行为

比如: 是否可修改 是否可删除 是否可枚举

属性描述符的分类

数据描述符

存取描述符

获取属性描述符

Object.getOwnPropertyDescriptor()方法

通过该方法可以获取到指定属性或方法的属性描述符

该方法接收两个参数

第一个 - 需要查找属性的目标对象

第二个 - 目标对象中需要查找的属性名称( string类型 )

该方法会将查找的结果,以对象的方式返回

var obj = {
    ahh : "啊哈哈"
}
var ahh = Object.getOwnPropertyDescriptor( obj, "ahh" );
console.log( ahh );
/* 显示 {
value: "啊哈哈", - 表示 属性或方法对应的值
writable: true, - 表示 是否可修改,值为boolean类型,true表示可以,false表示不可以,默认值为 false
enumerable: true, - 表示 是否可枚举,值为boolean类型,true表示可以,false表示不可以,默认值为 false
configurable: true  - 表示 是否可删除,值为boolean类型,true表示可以,false表示不可以,默认值为 false
} */
属性描述符的value属性

可以对指定对象添加新属性或方法

可以对指定对象中已有的属性或方法进行修改

Object.defineProperty()方法

该方法接收三个参数

第一个 - 表示指定的对象

第二个 - 表示指定对象中的属性名称,字符串格式

修改就填已存在的

新增就直接写新名

第三个 - 表示属性描述符,必须是对象格式 { }

/* 定义一个对象 */
var obj = {
    ahh : "啊哈哈"
}
/* 修改属性 */
console.log( obj.ahh );// 显示 啊哈哈
/* 对已有属性进行修改 */
Object.defineProperty( obj, "ahh", {
    value : "哈哈啊"
} );
/* 显示修改后的属性 */
console.log( obj.ahh );// 显示 哈哈啊

/* 添加属性 */
console.log( obj );// 显示 { ahh: "哈哈啊" }
/* 添加新属性 */
Object.defineProperty( obj, "ooo", {
    value : "哦哦哦",
    /*
        设置是否可枚举
         * 用于打印对象时可以正常显示新增的属性
         * 不设置可枚举时将无法显示新增属性,只显示原有属性
          * 显示 { ahh: "哈哈啊" }
     */
    enumerable : true
} );
/* 显示新增属性 */
console.log( obj );// 显示 { ahh: "哈哈啊", ooo: "哦哦哦" }
/* 调用新属性 */
console.log( obj.ooo );// 显示 哦哦哦
/*
    注意:
     * 通过Object.defineProperty()方法新增的属性
      * 该属性 - 不可修改 不可删除 不可枚举
     * 通过 对象名.属性名 = 属性值 的方法新增的属性
      * 该属性 - 可以修改 可以删除 可以枚举
 */
属性描述符的writable属性

表示指定属性或方法是否可修改

该属性值为boolean值

true - 表示可修改

false - 表示不可修改

Object.defineProperty()方法

该方法接收三个参数

第一个 - 表示指定的对象

第二个 - 表示指定对象中的属性名称,字符串格式

第三个 - 表示属性描述符,必须是对象格式 { }

/* 定义一个对象 */
var obj = {
    ahh : "啊哈哈"
}
/* 修改已有属性 */
Object.defineProperty( obj, "ahh", {
    value : "哈哈啊",
    writable : false // 不可修改
} );
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 不可修改 */
obj.ahh = "啊啊啊";
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 可修改 */
Object.defineProperty( obj, "ahh", {
    writable : true // 可修改
} );
obj.ahh = "啊啊啊";
console.log( obj.ahh );// 显示 啊啊啊
属性描述符的configurable属性

表示指定属性或方法是否可枚举

该属性值为boolean值

true - 表示可枚举

false - 表示不可枚举

Object.defineProperty()方法

该方法接收三个参数

第一个 - 表示指定的对象

第二个 - 表示指定对象中的属性名称,字符串格式

第三个 - 表示属性描述符,必须是对象格式 { }

/* 定义一个对象 */
var obj = {
    ahh : "啊哈哈"
}
Object.defineProperty( obj, "ahh", {
    enumerable : false// 不可枚举
} );
console.log( obj.ahh );// 显示 啊哈哈
/*
    * 只能遍历对象中可被枚举的属性
      * for...in语句
      * keys()方法
    * 可以遍历对象中可枚举和不可枚举的属性
      * getOwnPropertyNames()方法
 */
/* for...in语句 */
for ( var i in obj ) {
    console.log( i );
}// 没有显示

/* keys()方法 */
var obj1 = Object.keys( obj );
console.log( obj1 );// 显示 []空数组

/* getOwnPropertyNames()方法 */
var obj2 = Object.getOwnPropertyNames( obj );
console.log( obj2 );// 显示 [ "ahh" ]
属性描述符的configurable属性

表示指定属性或方法是否可删除

该属性值为boolean值

true - 表示可删除

false - 表示不可删除

Object.defineProperty()方法

该方法接收三个参数

第一个 - 表示指定的对象

第二个 - 表示指定对象中的属性名称,字符串格式

第三个 - 表示属性描述符,必须是对象格式 { }

/* 定义一个对象 */
var obj = {
    ahh : "啊哈哈"
}
/* 修改已有属性 */
Object.defineProperty(obj, "ahh", {
    configurable : false // 不可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
console.log(obj.ahh);// 显示 啊哈哈

Object.defineProperty(obj, "ahh", {
    configurable : true // 可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
/* 在调用已删除的属性会报错 */
console.log(obj.ahh);// 显示 TypeError: Cannot redefine property: ahh
属性描述符的存取器
/* 定义一个对象 */
var obj = {
    ahh : "ahh"
}
/* 定义一个全局变量 */
var quanju;
Object.defineProperty(obj, "ahh", {
    // 获取指定的属性值
    get : function(){// 当获取或访问当前属性时,会调用get方法
        /*
            类似于数据描述符中的value
            * get方法在被调用时,不能传递任何参数
            * get方法在被调用时,允许传递this关键字
              * this - 表示当前的目标对象(不能调用对象的当前目标属性)
          */
        return quanju;// 由于变量为初始化,调用时可能结果为 undefined
    },
    /*
        set方法用于定义当前目标属性的修改作用
        * 该方法接收唯一的一个参数 -> 作为当前目标属性的新的值
        * 通过属性修改操作指定的新的值 -> 作为形参对应的实参
     */
    set : function(canshu){
        /*
            set方法在被调用时,允许传递this关键字
              * this - 表示当前的目标对象(不能调用对象的当前目标属性)
         */
        quanju = canshu;
    }
});
console.log(obj.ahh);// 显示 undefined

obj.ahh = "啊啊啊";
console.log(obj.ahh);// 显示 啊啊啊
禁止扩展

表示不能添加新的属性或方法

Object.preventExtensions()方法

表示禁止扩展

Object.isExtensible()方法

表示用于判断指定对象是否可扩展

true - 表示可扩展

false - 表示不可扩展

/* 定义一个空对象 */
var obj = {};
/* 设置禁止扩展 */
Object.preventExtensions( obj );
/* 添加新属性 */
obj.ahh = "啊哈哈";
console.log( obj );// 显示 {}空对象
/*
    使用Object.defineProperty()方法进行新增属性会报错
    * TypeError: Cannot define property:name, object is not extensible.
 */
Object.defineProperty(obj, "ahh", {
    value : "啊哈哈"
});
console.log( obj );// 显示 Cannot define property ahh, object is not extensible

/* 判断指定对象是否可扩展 */
var panduan = Object.isExtensible( obj );
console.log( panduan );// 显示 false
密封对象

表示不能添加新的属性或方法,也不能对已有的属性或方法进行修改

Object.seal()方法

表示密封对象

Object.isSealed()方法

表示用于判断指定对象是否密封

true - 表示密封

false - 表示没密封

var obj = {
    ahh : "啊哈哈" // 表示可修改
};
console.log( Object.getOwnPropertyDescriptor( obj, "ahh" ) );

/*
    将该对象进行密封
    1.不能为该对象新增属性或方法
    2.不能修改该对象的属性或方法的描述符
      * configurable
      * enumerable
  */
/* 密封对象 */
Object.seal( obj );
console.log( Object.getOwnPropertyDescriptor( obj, "ahh" ) );

/* 判断指定对象是否密封 */
var panduan = Object.isSealed( obj );
console.log( panduan );// 显示 true
冻结对象

表示禁止对指定对象的任何修改操作

Object.freeze()方法

表示冻结对象

Object.isFrozen()方法

表示用于判断指定对象是否冻结

true - 表示冻结

false - 表示没冻结

var obj = {
    ahh : "啊哈哈"
}
/* 冻结对象 */
Object.freeze( obj );
/*
    对已经冻结的对象使用Object.defineProperty()方法进行操作
     * 会报错
     * TypeError: Cannot define property age, object is not extensible
 */
Object.defineProperty( obj, "age", {
    value : 18
} );
console.log( obj );//显示 Cannot define property age, object is not extensible

/* 判断指定对象是否密封 */
var panduan = Object.isFrozen( obj );
console.log( panduan );// 显示 true

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108172.html

相关文章

  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    Lyux 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    AaronYuan 评论0 收藏0
  • javascript面向对象总结

    摘要:之面向对象总结前言在中是没有类的概念的,所以它的对象与基于类的语言中的对象不同。一理解对象张三上面通过构造函数创建了一个对象,并为它添加了三个属性。 JavaScript之面向对象总结 前言:在ECMAScript中是没有类的概念的,所以它的对象与基于类的语言中的对象不同。ECMA-262把对象总结为:无序属性的集合,其属性包含基本值、对象或者函数。 一、理解对象 var person...

    taowen 评论0 收藏0
  • JavaScript面向对象原型

    摘要:一原型概括原型是什么对象包含数学方法的函数,函数定义在属性,初始值为一个空对象原型的属性和方法不会影响函数自身的属性和方法类型的属性所有函数都具有的属性定义函数原型的默认值是空对象函数包含构造函数所有引用类型其实都是构造函数获取原型通过 JS(JavaScript)一.原型1.概括 原型是什么 Function对象包含数学方法的函数,函数定义在protoype属性,初始值为一个空对象原...

    Cristalven 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<