美文网首页
面向对象03-常用方法

面向对象03-常用方法

作者: 肉肉与马甲线的故事 | 来源:发表于2017-05-31 20:35 被阅读0次

    Object.create()方法

    作用:创建对象并设置原型对象
    语法:var o=Object.create(obj) //创建一个空对象,并且设置这个空对象的原型对象为obj

    注意点:兼容问题(ES5)

    01 先判断是否支持这个Object.create方法,如果不支持,再利用对象的动态特性自己提供一个方法.

    代码示例

        var obj = {
            name:"张三",
            showName:function () {
                console.log(this.name);
            }
        };
        var o;
        if(typeof Object.create == "function")
        {
             o = Object.create(obj);
        }else
        {
            //o = {};
            //o.__proto__ = obj;  //非标准的属性
    
           // Object.getPrototypeOf(o) = obj;
    
            Object.create = function (obj) {
                function F() {};
                F.prototype = obj;
                o = new F();
            }
        }
    

    02 提供一个函数来封装这个功能,在函数内部先判断是否支持Object.create。 如果支持那么就使用Object.create,否则我们就自己实现

    代码示例

        var obj = {
            name:"张三",
            showName:function () {
                console.log(this.name);
            }
        };
        function create(objT) {
            if (typeof Object.create == "function") {
                return Object.create(objT);
            } else
            {
                function F() {};
                F.prototype = objT;
                return new F();
            }
        }
    
        //调用函数
        var o = create(obj);
    

    Object.assign()方法

    作用:用来拷贝属性,一次性拷贝多个属性
    语法:Object.assign(要拷贝属性的对象,被拷贝对象1,被拷贝对象2)

    注意点

    • 新特性有兼容问题
    • 原型成员能否被拷贝(否)
      ! 使用for...in循环拷贝,会将原型成员也拷贝,并且使用in关键字来判断方法包括原型方法

    代码示例

        var o = {};
        Object.assign(o, {name:"张三"},{age:20},{showName:function () {
            console.log("name");
        }});
    
        console.log(o);
        o.showName();    //name
    
        function F() {}
        F.prototype.hi = "hi";
        var f = new F();
        var obj = {};
        for (var i in f)
        {
            // 使用for....in循环只拷贝实例成员
            if(f.hasOwnProperty(i))   //hasOwnProperty方法只判断实例成员,将原型成员过滤出去
            {
                obj[i] = f[i];
            }
        }
        console.log(obj.hi);   
    
        var demo = {};
        Object.assign(demo,f);
        console.log(demo.hi);   //undefined
    

    call与apply函数(重点

    所有的对象方法都拥有这两个函数,所以这两个函数写在function.prototype上。

    作用:借用其他对象的方法

    语法:
    01 对象1.方法.call(借用者对象,参数1,参数2...) //方法内部的this指向call的第一个参数
    02 对象1.方法.apply(借用者对象,[参数1,参数2.......])

    两种方法的区别:

    • 传递参数的形式不一样
    • 两者期望参数长度不一样

    代码示例

        var p1 = {
            name:"张三",
            showName:function () {
                console.log(this.name);
            },
            showDes:function (str1,str2) {
                console.log("des" + str1,str2);
            }
        };
        var p2 = {
            name:"李四"
        };
    
        p1.showName();   //张三
        p1.showName.call(p2);   //p2借用p1对象的showName方法
        p1.showName.apply();   //window.name = 空("")
    
        //注意call和apply传递参数的区别
        p1.showDes.call(p2, "啦啦啦啦,暗黑魔法咒语","伏地魔");
        p1.showDes.apply(p2,["啦啦啦啦,暗黑魔法咒语","哈利波特"]);
    
        function demo(str1,str2,str3) {
        }
    
        console.log(demo.length);  //3.形参的长度,argument.length是实参的长度
        console.log(p1.showDes.call.length);   //1
        console.log(p1.showDes.apply.length);  //2
    

    相关文章

      网友评论

          本文标题:面向对象03-常用方法

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