zoukankan      html  css  js  c++  java
  • javascript权威指南笔记--javascript语言核心(四)

    对象:

    通过引用(而非值)来操作对象:  

    var obj = {"x":1,"y":2};
    var copyObj = obj;
    copyObj.x = 5;
    console.log(obj);//{x:5,y:2}

    对象最常见的用法是创建、设置、查找、删除、检测、枚举它的属性:

    (一)、创建对象

    (1).对象直接量创建   

    var empty = {};
    var point = {x:1, y:2};
    var point2 = {x:point.x,y:point.y};
    var book = {
      "main title":"Javascript",//属性名有空格,必须用引号括起来
      "sub-title":"object",//属性名有连字符,必须用引号括起来
      "for":"all reader",//属性名是关键字,必须用引号括起来
      author:{//属性名是一个对象,不加引号
        firstname:"Dvaid",
        lastname:"Benjemin"
      }
    };

    (2).通过new创建对象

    var o = new Object();//相当于{}
    var a = new Array();//相当于[]
    var d = new Date();
    var r = new RegExp("js");//相当于/js/

    (二)、属性的查询和设置

    (1).可以通过.或者[]来访问对象的属性,.右侧必须是一个属性名称,[]内的属性名必须以""括起来。 

    var lastname = author.lastname;
    var firstname = author["firstname"];

    (2).通过.或[]创建新的属性,或者给属性赋值。在ECMAScript3中,.后面的标识符不能使保留字,如for、class,[]内的表达式必须是字符串或者可以转换成字符串的值。

    book.page = 200;//新建page属性
    book["type"] = "computer";//给type属性赋值

    (3).继承  通过inherit函数继承来的对象,修改对象的属性不会影响到原型链原对象的属性值。

    function inherit(p){
        if(p == null) throw TypeError();
        if(Object.create) return Object.create(p);
        var t = typeof(p);
        if(t !== "object" || t !== "function") throw TypeError();
        function f(){};
        f.prototype = p;
        return new f();
    }
    
    var accessor = {r:1,s:5};
    var o = inherit(accessor);
    o.x = 7;
    o.y = 9;
    o.r = 2
    console.log("s:"+o.s);//s:5
    console.log("r:"+o.r);//r:2
    console.log("accessor.r:"+accessor.r);//accessor.r:1

    (4).属性访问错误:查询一个不存在的属性不会报错,只是返回一个undefined,如果查询一个不存在的对象的属性就会报错。

      避免出错的方法:

    var len = book && book.subtitle && book.subtitle.length;//获取子对象的长度

    (5).删除属性:delete只能删除自有属性,不能删除继承属性。

    var a = {p:{x:1}};
    var b = a.p;
    delete a.p;
    console.log(a);//{}
    console.log(b);//{x:1}

    因此,在销毁对象的时候要遍历对象中的属性并依次删除,避免内存泄露。

    在严格模式下删除不可配置的属性会报语法错误,比如通过变量声明和函数声明穿件的全局对象的属性。在非严格模式下返回false,eg:

    delete Object.prototype;//不能删除不可配置属性
    var x = 1;
    delete this.x;//不能删除全局对象的属性
    function f(){}
    delete this.f;//不能删除全局函数

    (6).检测属性:

    in运算符:如果对象的自有属性或继承属性中包含这个属性,则返回true。

    hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性,对于继承属性,它将返回false。

    propertyIsEnumerable()只检测自有属性,且这个属性的可枚举性为true的时候才返回true。

    var o = {x:1,y:2};
    "x" in o;//true
    "z" in o;//false
    "toString" in o;//true
    
    var p = {x:1};
    p.hasOwnProperty("x");//true
    p.hasOwnProperty("toString");//false

    (7).枚举属性:

    for/in循环遍历对象中所有可枚举的属性(包括自身的和继承的),对象继承的内置方法是不可枚举的。

    过滤继承的属性,跳过方法:

    for(p in o) {
        if(!o.hasOwnProperty(p)) continue;//跳过继承的属性
    }
    
    for(p in o) {
      if(typeof(p) === "function") continue;//跳过方法
    }

     ECMAScript 5定义了两个枚举属性的函数:

     Object.keys()方法返回一个数组,数组由对象可枚举的自有属性组成。Object.getOwnPropertyNames()返回对象所有的自有属性的名称(不仅仅是可枚举的属性)组成的数组。

  • 相关阅读:
    ppt 制作圆角三角形
    ROS 错误之 [rospack] Error: package 'beginner_tutorials' not found
    ubuntu下安装搜狗输入法以及出现不能输入中文的解决办法
    <crtdbg.h> 的作用
    mybatis配置
    POJO、Bean和JavaBean
    类类型与反射
    Spring层面的事务管理
    java项目常用架构
    java 遍历数组的几种方式
  • 原文地址:https://www.cnblogs.com/rellame/p/4998592.html
Copyright © 2011-2022 走看看