• JavaScript 建立对象方法 Object.create()、new Object()、{} 比较


    1 Object.create()

    Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString()、hasOwnProperty() 等方法
    Object.create() 方法接受两个参数: Object.create(obj, propertiesObject)

    obj: 一个对象,新创建的对象的原型。
    propertiesObject:可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。

    注意:propertiesObject 参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,即 该对象的原型链上属性是无效的。

    var obj = Object.create(Object.prototype, {
      // foo会成为所创建对象的数据属性
      foo: {
        configurable: true, //能否使用delete、能否需改属性特性、或能否修改访问器属性,默认为false不可重新定义
        enumerable:false, //对象属性是否可通过for-in循环,默认值为flase不可循环
        writable: true, //对象属性是否可修改,默认值为flase不可修改
        value: "hello" //对象属性的默认值,默认值为undefined
      },
    
      // bar会成为所创建对象的访问器属性
      bar: {
        configurable: false,
        get: function () { return 10 },
        set: function (value) {
          console.log("Setting `o.bar` to", value);
        }
      }
    });
    
    console.log(obj.foo); // hello
    console.log(obj.foo = '你好!') // 你好!
    var other = Object.create(null);
    console.log(other); // {} No Properties
    

    2 new Object() 和 {}

    new Object() 和 {} 的本质并无区别,默认都是继承了Object对象上的prototype

    var test0 = {}
    var test1 = { x: 1 }
    
    var test2 = new Object()
    var test3 = new Object(test1) // 继承test1
    
    var test4 = Object.create(test1)
    
    var test5 = function () { } // 构造函数
    test5.prototype = test1 // 继承test1
    
    var test6 = new test5()
    
    console.log(`test0:`, test0) // test0: {}      __proto__.constructor: Object()
    console.log(`test1:`, test1) // test1: { x: 1} __proto__.constructor: Object()
    console.log(`test2:`, test2) // test2: {}      __proto__.constructor: Object()
    console.log(`test3:`, test3) // test3: {x:1}   __proto__.constructor: Object()
    console.log(`test4:`, test4) // test4: {}      __proto__ 为test1
    console.log(`test5:`, test5) // test5: f(){}
    console.log(`test6:`, test6) // test6: test5 {}
    console.log(test0.__proto__ === test2.__proto__) // true
    console.log(test1.__proto__ === test3.__proto__) // true
    console.log(test3.__proto__ === test4.__proto__) // false
    console.log(test6.__proto__ === test1) // true
    console.log(test6.__proto__ === test3.__proto__) // false
    console.log(test6.__proto__ === test4.__proto__) // true
    
  • 相关阅读:
    ZOJ3329One Person Game(循环型 数学期望)
    ZOJ3551Bloodsucker (数学期望)
    HDU3853LOOPS (师傅逃亡系列•三)(基础概率DP)
    HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)
    阿里云DataV专业版发布,为可视化创造更多可能!
    Logtail提升采集性能
    达摩院首席数据库科学家李飞飞:云原生新战场,我们如何把握先机?
    什么是最佳的视频用户体验?阿里云视频服务四大体验优化实践
    Lambda plus: 云上大数据解决方案
    基于大数据的舆情分析系统架构
  • 原文地址:https://www.cnblogs.com/lqqgis/p/14919180.html
Copyright © 2020-2023  润新知