• JavaScript原型链学习


    function foo(){}
    foo.prototype.z = 3;
    
    var obj = new foo();
    obj.y = 2;
    obj.x = 1;
    
    obj.x; //1
    obj.y; //2
    obj.z; //3
    typeof obj.toString; //'function'
    'z' in obj; //true
    obj.hasOwnProperty('z'); //false



    首先,我们通过function foo()去定义一个函数对象。。那么,foo()对象自动带有prototype对象属性,如图所示添加了z属性。再通过new构造器,构造obj对象,如图所示,obj的原型指向构造器的prototype属性也就是foo.prototype。

    再看例子:obj.x和obj.y会在obj对象上找到x,y属性,而obj上没有z属性,当obj.z时,obj上没有z,此时就会查找原型上的属性,发现z=3。

    foo.prototype的原型是Object.prototype,Object.prototype的原型是null。Object.prototype的作用是:如图所示,typeof obj.toString是一个‘function’,而在ibj以及它的原型上都找不到toString方法,而js中默认的对象上基本都有toString方法,是因为他们的原型指向null之前都会指向Object.prototype,toString正是Object.prototype上的方法。

    obj. hasOwnProperty('z')返回false,表示z属性并不是直接为obj的属性。

    obj.z = 5;
    
    obj.hasOwnProperty('z'); //true
    foo.prototype.z; //still 3
    obj.z; //5
    
    obj.z = undefined;
    obj.z; //undefined
    
    delete obj.z; //true
    obj.z; //3
    
    delete obj.z;  //true
    obj.z; //still 3!!!

    像代码中所写,obj.z = 5;对于赋值来说,先在obj对象上查找,如果没有,此时不会在原型链中查找,而是在这个对象上添加z=5;foo.prototype.z依旧为3。

    当obj.z=undefined时,obj对象上z属性的值被修改为undefined,所以返回undefined时不一定代表不存在。

    当delete obj.z后,拿到z的值为原型上的z的值。obj上的z属性已经被删除。

    原型链上大部分属性的 Enumerable(可枚举)标签都是false,也就是说console.log一个对象的时候都只显示自己的对象,而在控制台能看到很多属性

    属性标签有:value:true,writeable:true(是否可写),enumerable:true(是否可枚举),configurable:true(表示前面这些属性是否可修改)

    未来的你会感谢现在努力的你
  • 相关阅读:
    redis 之redis集群与集群配置
    redis 之redis-sentinel主从复制高可用
    Python 基础之函数的嵌套与nonlocal修改局部变量及闭包函数
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/cjxblogs/p/7429544.html
Copyright © 2020-2023  润新知