美文网首页
Javascript学习笔记——6.2 属性的访问和赋值

Javascript学习笔记——6.2 属性的访问和赋值

作者: IFELSE | 来源:发表于2018-04-19 10:09 被阅读0次

    可以通过.[]运算符来获取属性的值,两者完全等价。

    对于.来说,右侧必须是属性名称的简单标识符。
    对于[]来说,右侧可以是表达式,但表达式结果必须是字符串或者可以自动转换为字符串的值。

    var author = Book.author
    var year = Book['year']
    

    也可以通过.[]给属性赋值

    Book.author = {name:'Mike', age:'38'}
    Book['year'] = 2011
    

    关联数组

    可以看出[]的访问方式与数组类似,区别就是数组是使用数字作为索引,对象使用字符串作为索引。

    使用字符串作为索引的数组成为关联数组,也成为散列映射字典Javascript对象都是关联数组。

    []在动态建立属性时比.更具有灵活性,如下功能使用.就无法实现:

    //将客户的多个地址合并
    var addr = ''
    for(i=0;i<4;i++){
      addr += customer['address'+i]+'\n'
    }
    

    例如,股票系统中,因为实现无法直到客户买什么股票,可以通过动态添加属性的方式来实现该功能

    //用holding对象保存持仓股票
    function buyStock(holding,stockname,shares){
      holding[stockname] = shares
    }
    

    练习:如何计算股票总价值? 使用for/in

    继承

    Javascript对象的属性分为自有属性和继承属性(从原型对象继承)。

    属性读取:
    Javascript对象查找属性按照以下原则进行:假设查询o的属性x,如果o没有x属性,就在o的原型对象中查找x属性;如果o的原型对象也没有x属性,就继续查找原型对象的原型的属性,直到找到x或者原型为null位置。可以看出这个过程是一个链式查找的过程,这个链成为原型链

    属性赋值:
    属性赋值操作,总是在原始对象上创建或修改属性,不会去修改原型链。
    如果对象o已经包含属性x,则直接修改属性x的值;如果o没有属性x,则给o添加x属性并赋值。如果o的原型对象有属性x,赋值会覆盖该属性,但不会改变原型对象x的值。即o和原型对象各自有x属性,值互不干扰,o.x和o.proto.x可以不同。

    Javascript中,只有在查询属性时才有继承存在,设置属性和继承无关。

    var o={}
    o.x = 1
    var p = Object.create(o)
    p.y = 2
    var q = Object.create(p)
    q.z = 3
    console.log(q.x+q.y+q.z) //6
    p.a = 9
    console.log(q.a) //9
    

    属性访问错误

    访问对象不存在的属性并不会报错,会得到undefined。但如果对象不存在,就会报错,可用if(o)这种形式避免错误。

    var len
    if(book&&book.title&&book.title.length){ //利用了&&的短路运算
      len = book.title.length
    }
    

    以下情况属性赋值会失败:

    • 属性是只读的,不管是自有属性还是继承属性。
    • 对象的可扩展性是false,而且原型链中也没有该属性。

    相关文章

      网友评论

          本文标题:Javascript学习笔记——6.2 属性的访问和赋值

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