原型原型链,属性的扩展

2017-10-26  本文已影响0人  悲欢自饮丶

原型和原型链

原型

将伪数组转化为真数组&怎么判断一个变量是不是数组

    var arr = {length:3,0:"a",1:"b",2:"c"};
        arr.push('d');//报错 伪数组不能使用数组的方法
        var arr2 = Array.prototype.slice.call(arr);
        arr2.push("d")
        console.log(arr2)

默认值

    function test(arr,fn){
            arr =arr||Array.prototype;
            fn =fn||Function.prototype;

            return arr.map(fn).join(" ");
        }
        console.log(test());

==的使用规则

  //正常情况下[""]的valueof方法返回原数组[""]
    再调用[""].tostring()返回""
    再调用number()返回0
  console.log([""]==false)//true

  //方法的重写
  Array.prototype.valueof = function(){
    return 1;
  }
  console.log([""]==flase)//false

原型链的继承

  //构造函数   new Element()--->返回一个真实的dom节点
  function Element(id){
       this.ele = document.getElementById(id);
    }

    Element.prototype.innerText= function(val){
       var ele = this.ele;
       if(val){
         ele.innerText = val;
         return this;//链式调用
       }else{
         return ele.innerText;
       }
     }

   Element.prototype.on = function(val,fn){
            var ele = this.ele;
            if(ele.addEventListener){
                ele.addEventListener(val,fn);
                return this
            }
        }

     var textNode = new Element("test");
     textNode.innerText("text")//写
     textNode.innerText("text").innerText()//链式调用
     console.log(textNode.innerText("text").innerText())//读

     textNode.on("click",function(){
            alert(1);
        }).innerText('text')

综合面试题

    //运算符的优先级
        //左右查询
        //原型链
        //this
        //属性的查找
        //提升

        function getName() {
            alert (5);
        }
        function Foo() {
            getName = function () { alert (1); };
            return this;
        }

        Foo.getName = function () {
            alert (2);
        };
        Foo.prototype.getName = function () {
            alert (3);
        };
        var getName = function () {
            alert (4);
        };

        Foo.getName(); //2
        getName();//4
        Foo().getName(); //1
        getName(); //1
        new Foo.getName(); //2
        new Foo().getName()//3

原型&原型链

    Object.prototype.__proto__===>null
        Function.__proto__ === Function.prototype
        Object.__proto__  === Function.prototype
        Function.prototype.__proto__ === Object.prototype
        Object.prototype.__proto__=== null

javascript中的属性

变量的查找

属性描述符(元属性)

    var damu={};
        Object.defineProperty(damu,"age",{
            value:18,
            writable:true
        })

        Object.defineProperty(damu,"age",{
            value:19,
            configurable:true//报错
        })
    console.log(damu)//age:19
    var a=3;
        b=4;

        console.log(Object.getOwnPropertyDescriptor(window,"a"))
        console.log(Object.getOwnPropertyDescriptor(window,"b"))

        delete a;//a configurable:false不能删除
        delete b;//b configurable:true可以被删除

        console.log(a)//3
        console.log(b)//报错
    var damu={};
        Object.defineProperty(damu,"a",{
            enumerable:false
        })
        Object.defineProperty(damu,"b",{
            enumerable:true
        })
        Object.defineProperty(damu,"c",{
            enumerable:true
        })
        Object.defineProperty(damu,"d",{
            enumerable:true
        })
        Object.defineProperty(damu,"e",{
            enumerable:false
        })
        Object.defineProperty(damu,"f",{
            enumerable:false
        })

    for(item in damu){
            console.log(item);//输出b,c,d
        }

        for(item in damu){
            if(damu.hasOwnProperty(item)){
                console.log(item);
            }
        }

    Object.defineProperty(Object.prototype,"text",{
      value:"text"
        enumerable:true
    })
    console.log(damu.text)//text可以找到

    console.log(damu.propertyIsEnumerable("f"))//false
    console.log(damu.propertyIsEnumerable("text"))//false不会在原型链上找
    console.log(Object.keys(damu));//可枚举类型(不会在原型链上找)
    console.log(Object.getOwnPropertyNames)//所有属性列表(不会在原型链上找)

定义对象属性的两种方法

    var damu={
            wife:"zdy"
        }
        damu.wife="fbb";
    console.log(damu);
    var damu={}
        Object.defineProperty(damu,"age",{
            value:18
        })
        console.log(damu);

对象的不变性

对象的常量属性

禁止对象扩展

密封对象

冰封对象

深度冻结对象

    var obj={
            hoddy:{
                hoddy1:"a",
                hoddy2:"b",
                hoddy3:"c",
                hoddy4:"d",
                hoddy5:"e"
            }
        };

        Object.freeze(obj);
        obj.hoddy.hoddy1 = "g"//hoddy1会发生改变
        console.log(obj)

    for(item in obj){
      Object.freeze(obj[item]);
    }

存在性检查

访问描述符

总结

属性的查找

属性的设置

上一篇 下一篇

猜你喜欢

热点阅读