最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 你真的会用Object.create?

    正文概述 掘金(him8)   2021-04-04   415

    说起Object.create,我们经常会在es5实现原生继承时被经常用到,但对于整个api却显得并不是那么熟悉,让我们再来好好看一下这个api

    Object.create定义

    基本语法

    • proto: 新创建对象的原型对象
    • propertiesObject:(可选参数) ,传入一个对象,对象的某一个属性值为属性描述对象,可参考Object.defineProperties()的第二个参数,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。

    上面的propertiesObject,即第二个参数传参是一个比较难理解的点,我们通过下面这一个例子来瞧瞧, 顺便把属性描述对象中的enumerable属性再做一个总结。

    示例

    var person = {
        address: "world"
    }
    
    var son = Object.create(person, {
        name: {
            value: "min",
            writable: true,
            enumerable: true
        },
        sex: {
            value: "men",
            enumerable: false,
            writable: true
        },
        age: {
            value: 23
        }
    });
    
    console.log(son);  // node: { name: 'min' }   chrome: {name: "min", sex: "men", age: 23}
    console.log(son.__proto__);  // person
    console.log(son.address);    // world
    console.log(son.age);  // 23
    

    上面的例子中可以看到:

    1. 通过Object.create创建的对象son, 存在自身属性name,sex,age,当然这些自身属性在node和chrome下,对象展示略有不同
    2. 新创建对象son的原型指向person

    enumerable

    这是一个很奇特的属性,我们要再来认识一下这个属性
    同样来看一个例子

    /* enumerable */
    var person = {
        name: "min"
    }
    
    Object.defineProperty(person,"age",{
        value: 23,
        enumerable: false
    })
    
    console.log(person);  // node: { name: 'min' }   chrome: {name: "min", age: 23}
    console.log(Object.keys(person));  // [ 'name' ]
    for(var i in person){
        console.log(i)
    }               // name
    console.log(Object.getOwnPropertyNames(person))  // [ 'name', 'age' ]
    console.log(person.age);  // 23
    

    总结下几点:

    1. 在打印person时,node, chrome下有不同,chrome会把不可枚举属性也打印,而node则不会
    2. 属性key值非Symbol下:Object.keys,for...in 会打印出所有可枚举属性,getOwnPropertyNames会打印所有属性
    3. 不管是在node还是chrome环境下,person.age的方式同样可以取出不可枚举属性值

    应用

    • 实现继承
    function Super(name, age){
        this.name = name;
        this.age = age;
        this.sayHello = function(){
            console.log("hello,"+ this.name)
        }
    }
    
    function Sub(name,age,habit){
        this.habit = habit;
        Super.call(this, name, age);
    }
    
    Sub.prototype = Object.create(Super.prototype, {
        constructor:{   // 构造函数修复
            value: Sub    // 无需枚举
        }
    })
    var sub = new Sub("min", 23, "sleep");
    console.log(sub instanceof Sub); // true
    console.log(sub instanceof Super); // true
    console.log(sub.constructor);  // Sub
    

    可以看到使用Object.create可以轻松实现原型的继承以及constructor的回指。


    谢谢你读完本篇文章,希望对你能有所帮助,如有问题欢迎各位指正。

    我是him8(✿◡‿◡),如果觉得写得可以的话,请点个赞吧❤。


    起源地下载网 » 你真的会用Object.create?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元