• JavaScript总结3—对象


    对象是JavaScript的基本类型,他可以从一个称为原型的对象继承属性,这种原型式继承是JavaScript的核心特征。对对象比较常见的操作有:创建,设置,查找,删除,检测和枚举他的属性。每个对象都拥有3个对象特性:对象的原型,对象的类,对象的扩展标记。

    一、对象的创建

    1.使用对象直接量

    var o = { x : 1, y : 2 }; 这就是对象直接量的表达式,他每次运算都创建并初始化一个新的对象。最好不要将属性名取成和关键字一样的。

    2.通过new创建对象

    var d = new Date();  不仅仅可以new内置的对象,还是new自定义的对象。

    3.通过Object.create()创建

    var o2 = Object.create(o);  第一个参数为o2的原型,必须有。若第一个参数为null ,则他是个没有原型的对象。若第一个参数为Object.prototype,则他是个空对象。

    二、查询和设置

    有两种方法,一个是用 .   还有一个用 [ ] 。如 o.x  和 o["x"] 都可以访问和设置对象o的x属性。

    1.对象属性名是个关键字那么只有用中括号去访问。

    2.属性名是个不确定的参数,那么也用中括号访问。

    3.访问不存在的属性

    三、删除属性

    delete o.x;  或者 delete o["x"] ; delete运算符只能删除自有属性,不能删除继承属性,也不能删除那些不可配置的属性。他的返回值是truefalse。若删除一个对象自身没有的属性,返回是true

    四、检测属性

    1. in 运算符

    "x" in o2 ;// 返回true 。左边字符串是属性,右边是对象,判断这个对象是否有这个属性。in会顺着原型链查找。

    2. hasOwnProperty 函数

    o2.hasOwnProperty("x") ; //返回false。他判断o2自身是否有x属性,不会查找原型链。

    3. propertyIsEnumerable 函数

    o2.propertyIsEnumerable("x") ; //返回false。他判断x 是否是o2的自身的并且可枚举的属性。

    五、枚举属性

    枚举属性用for-in循环。for(var i in o2){ console.log(i); } ,但是这种会把原型链上的可枚举属性都循环出来。

    要取自身的属性,用hasOwnProperty判断。

    for(var i in o2){
                    if(o2.hasOwnProperty(i)){
                        console.log(i);
                    }
                }

    六、getter和setter

    对象的属性值可以用一个或两个方法代替,他们分别是getter和setter,由getter和setter定义的属性称作存取器属性

    var o = {
        x:1,
        y:2,
       
        get r() { return this.x + this.y; },
        set r(data){ return this.x + this.y + data; },
        get s(){ return this.x * this.y; }
    };
    console.log(o2.x);

    console.log(o2.s);

    他的作用有:检测属性的输入值,改变读取属性的返回值…

    七、属性的特性

    对象的数据属性应该是包含了一个属性名和四个特性:值(value),可写性(writable),可枚举性(enumerable)和可配置性(configurable)。想看一个属性的这个特性的值,可以用Object.getOwnPropertyDescriptor。

    eg : Object.getOwnPropertyDescriptor(o,"x"); // 查看对象o中x属性的特性,他只能用于自身属性

    这四个特性是可以设置的。Object.defineProperty();

    eg:  Object.defineProperty(o,"x",{value:3,writable:false,enumerable:false,configurable:false});

    这个函数的第三个参数属性描述符对象不必包含所有的4个特性。

    八、关于类

    在js中,类的实现是基于原型继承机制的。在创建对象的3中方式中,有一种用new关键字创建一个新的对象,他就相当于一个构造函数。一个普通的函数通常约定,作为构造函数的函数,首字母应该大写

    var O3 = function(){
                    this.x = 1;
                    this.y = 2;
                };

    var o4 = new O3(); //o4就是o3类的对象。

    o4是以O3为原型的一个新对象。此时o4具有一个属性:constructor。这个属性指向的是他的构造函数,即O3。而o4的prototype也是o3。

    console.log("o4 constructor :"  + o4.constructor);
    console.log("o4 prototype :" + Object.getPrototypeOf(o4));

    image

    instanceof 运算符 :o4 instanceof o3 //true

    他的左操作符是一个对象,右操作符是定义这个对象的构造函数。他其实是检测对象的原型链上是否有这个类。

    九、原型和原型链

    除了null以外,每个对象都和一个原型关联。所有通过对象直接量创建的对象,原型为Object。通过new出来的对象,他的原型就是构造函数的prototype的值。例如:通过new Object()出来的对象,原型是Object.prototype(他没有原型对象了),通过new Array()创建的对象原型就是Array.prototype。所有的内置构造函数都具有一个继承自Object.prototype的原型,例如通过new Date()出来的对象原型是Date.prototype,而Date.prototype属性继承于Object.prototype,所以这个对象同时继承了Date.prototype和Date.prototype,这系列的继承被称为原型链。

    在原型链上查找和修改属性。例如,用前面的列子,查询o2.x 首先查询o2是否具备x属性,若不存在,则顺着他的原型链的上一级(o2.prototype)查找,发现他的上一级是o,然后看o中有没有x,有就返回这个x,若没有,继续顺着o的原型链向上查找,若最后找完还是没有,返回undefined。当修改o2.x的属性时,首先检查原型链,判断是否允许赋值操作。若允许,那么修改操作也只会在o2上创建一个新的属性或对o2自身已有的属性进行修改,不会动原型链上的任何属性,这样做,若有同名属性则会覆盖掉原型链上的属性。注意:原型链只有在查询属性值时才会被用到。可以在原型链上添加函数,然后继承这个原型的类就可以调用这个函数。

    o3.prototype.add = function(){
                    return this.x + this.y;
                };

    o4.add();

  • 相关阅读:
    php+apache+mysql环境搭建
    怎么理解依赖注入
    maven修改远程和本地仓库地址
    idea创建的java web项目打包发布到tomcat
    MYSQL 导入导出数据库文件
    MySQL约束
    mysql字符集校对
    prime
    POJ-2564 01背包问题
    POJ-1564 dfs
  • 原文地址:https://www.cnblogs.com/lzq1065763582/p/4844823.html
Copyright © 2020-2023  润新知