• javascript 查找属性的过程


     当执行 一个对象赋值操作的时候  js引擎会怎样处理呢???

    例如  有个foo对象  ,要进行这个操作 foo.a=2

    1, 首先会在foo对象中查找,如果不存在a属性,就会去原型链上面找,如果原型链上面也不存在该属性,就会在foo对象中创建一个a属性并且值为2

    2 ,  如果foo对象中不存在,在原型上层找到了a 属性,之后会进行一下三种情况:

        ①,如果原型上层的a属性是普通数据属性,且不是只读属性,那么就会在foo对象中创建一个a属性并且值为2,屏蔽了原型上层的a属性

      ②,如果原型上层的a属性是只读属性,那么该操作会被忽略,在严格模式下,会报错

        ③,如果原型上层的a属性是存储器属性,那么就会调用setter方法,不会在foo对象中创建a属性,也不会重新定义a这个setter

    下面是些例子:

     1 // var obj={
     2 //     a:1,
     3 //     b:2,
     4 // }
     5 
     6 // 第一种情况
     7 var obj1={
     8     //数据属性
     9     c:2,
    10     d:3,
    11     e:function(){
    12         return this.c;
    13     }
    14 }
    15 // obj.__proto__=obj1;
    16 function f(){
    17     this.a=1;
    18     this.b=2;
    19 }
    20 f.prototype=obj1;
    21 var obj=new f();
    22 console.log(obj.d);//3
    23 obj.d=6;
    24 console.log(obj.d);//6
    25 console.log(obj1.d);//3
    26 
    27 // 第二种情况
    28 Object.defineProperty(obj1,'ff',{
    29     value:11,
    30     writable:false,
    31     configurable:true,
    32     enumerable:true
    33 })
    34 console.log(obj.ff);//11
    35 obj.ff=33;
    36 console.log(obj.ff);//11
    37 console.log(obj1.ff);//11
    38 
    39 // 第三种情况
    40 Object.defineProperty(obj1,'g',{//访问器属性
    41     get:function(){
    42        return this.c
    43     },
    44     set:function(val){
    45        console.log("我被执行了"); 
    46        this.c=val
    47     },
    48 })
    49 console.log(obj.g);//2
    50 obj.g=22;
    51 console.log(obj.g);//22
    52 console.log(obj1.g);//2
    

     总结的方法:

     for...in..    遍历对象中所有可枚举的属性(包括自有属性和继承的属性)
     Object.keys()  返回值是数组,由对象中可枚举的自有属性名称组成
     Object.getOwnProperty()  返回对象的自有属性 (括可枚举和不可枚举)
     Object.hasOwnProperty(x)  检测x是否是对象的自有属性,对于继承的属性它返回false
     Object.isPrototypeof(x)  检测某对象是否是x对象的原型(或处于原型链中)
     Object.propertyIsEnumerable(x) 检测x属性是自有属性且这个属性是可枚举的它返回true
     Object.getOwnPropertyDescriptor(obj, prop)  可获取某对象的自有属性的属性描述符
     Object.getOwnPropertyNames() 返回对象的所有自有属性名称(包括可枚举和不可枚举)
     Object.getPrototypeof(x)   可以查询x的原型
    
     数据属性四个特性
     1)configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true
     2)enumerable:表示能否通过for-in循环返回属性
    3)writable:表示能否修改属性的值 4)value:包含该属性的数据值。默认为undefined 存储器属性四个特性 1)configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true 2)enumerable:表示能否通过for-in循环返回属性 3)set:写入 4)get:读取
  • 相关阅读:
    机房收费系统——报表(2)
    机房收费系统——报表(1)
    机房收费系统之结账
    机房管理系统——vb与excel链接2
    机房管理系统——VB与Excel的链接
    Unity
    Android Dev Tips
    Android JSON And Object Cast
    Android Screen Orientation
    iOS8 with Swift
  • 原文地址:https://www.cnblogs.com/zhanghaiyu-Jade/p/10562373.html
Copyright © 2020-2023  润新知