美文网首页
JavaScript对象简介

JavaScript对象简介

作者: 读心读书 | 来源:发表于2019-03-14 12:11 被阅读0次

    对象是JavaScript的基本数据类型,是一种复合值:它将很多的值组合一起,可以通名字来访问这些值。属性名是字符串,可以把对象看成是字符串到值的映射。这种数据结构可以称为散列(hash)、散列表(hashtable)、关联数组。

    对象常见的用法是创建、设置、查找、删除、检测和枚举。

    每个对象都拥有三个相关的对象特性:

    1、对象的原型指向另一个对象,本身的属性继承于另一个对象的原型对象。

    2、对象的类是一个标识对象类型的字符串。

    3、对象的扩展标记指明了是否可以向该对象添加新的属性

    对象相关的术语

    内置对象:ECMAScript规范定义的对象或者类,如数组、函数、日期和正则表达式。

    宿主对象:JavaScript解释器嵌入宿主环境定义的,HTMLElement对象是宿主对象。

    自定义对象:JavaScript代码创建的对象。

    自有属性:直接在对象中定义的属性。

    继承属性:在对象的原型对象中定义的属性。

    创建对象

    1、通过直接量创建对象:例如

    var str = {};
    var string = {
        name:duxin,
        age:18
    }
    

    2、通过new创建对象:new运算符创建并且初始化一个新的对象,new后边跟着一个函数(构造函数constructor),构造函数用来初始化一个新建的对象。

    var str = new Object();
    var arr = new Array();
    var data = new Date();
    var reg = new RegExp();//创建一个模拟匹配的RegExp对象。
    

    3、通过原型来创建对象:
    Object.prototype没有原型,它不继承于任何属性,其他原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数都具有一个继承于Object.prototype的原型,例如:Date.prototype的属性继承于Object.prototype。
    所有通过对象直接量创建的对象都具有同一个原型对象,

    4、Object.create()创建对象, Object.create()是一个静态函数,不是提供给某个对象调用的方法。使用Object.create()创建对象,只需传入参数即可。

    //返回一个继承自原型对象p的属性的新对象
    function createObj(p){
    
                if(p == null){}throw TypeError();
                      // p是一个对象,但不能是null
                if(Object.create) 
                                     // 如果Object.create()存在
                return Object.create(p);  
                         // 直接使用它
                var t = typeof p;                       
                 // 否则进行进一步检测
                if(t !== "object" && t !== "function")throw TypeError();
    
                function f(){};
                                        // 定义一个空构造函数
                f.prototype = p;  
                                       //将其原型属性设置为p
                return new f();                        //使用f()创建p的继承对象
            }
    

    对象属性的查询和设置

    通过点火方括号运算符来获取属性的值。对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于方括号来说([]),方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字。

    删除属性

    使用delete运算符来删除对象的属性。delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性

    检测属性

    通过in运算符、hashOwnPreperty()、propertyIsEnumerable()方法来实现判断某个属性是否存在于某个对象中,hashOwnPreperty()用来检测属性是否属于对象自有的属性,针对于继承的属性,它将返回false。propertyIsEnumerable()检测自身属性的可枚举型为true时才返回true

    var str = {name:"duxin"};
    console.log("name" in str); //true
    console.log("toString" in str); //true
    console.log(str.hasOwnProperty("toaString")); //false,toString是继承来的属性。
    

    使用for/in循环在循环体中遍历对象中所有的可枚举的属性(包括自有属性和继承属性),把属性名赋值给循环变量。对象内置方法不可枚举。例如:

    var o = {x:12,y:25,z:56}
    console.log(o.propertyIsEnumerable("toString"))//false
    for(const a in o){
        console.log(a)
    }
    
    //跳过继承属性
    for(const k in o){
        if (!o.hasOwnProperty(k)) {
            continue
        }
    }
    //跳过方法
    for(const j in o){
        if(typeof o[j] === "function"){
            continue;
        }
    }
    

    属性特征

    调用Object.getOwnPropertyDescriptor(),可以获得某个对象特定(自有)属性的属性描述符;

    Object.getOwnPropertyDescriptor(obj,"属性");
    

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

    var o = {};
    Object.defineProperty(o,"x",{
        alue:5,
        writable:true,
        enumerable:false,
        configurable:true
    });
    console.log(o.x=6);
    console.log(Object.keys(o));
    

    调用Object.defineProperties(),修改或者创建多个属性。第一个参数是要修改的对象,第二个是一个映射表,包含了要新建或者修改的属性名称和属性描述符。语法:

    var str = Object.defineProperties({},{x:{},y:{}});
    

    任何对Object. defineProperty()或Object.defineProperties()违反规则的使用都会抛出类型错误异常:

    1、若对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新的属性;

    2、若属性不可配置,则不能修改它的可配置性和可枚举性;

    3、若存取器属性是不可配置的,则不能修改其getter和setter方法,也不能把它转化为数据属性;

    4、若数据属性是不可配置的,则不能把它的可写性从false改成true,但是可以从true改成false;

    5、如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)。

    相关文章

      网友评论

          本文标题:JavaScript对象简介

          本文链接:https://www.haomeiwen.com/subject/uvjqmqtx.html