• 转载:Object的create方法文档


    源地址:https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/create#.E4.BD.BF.E7.94.A8Object.create.E5.AE.9E.E7.8E.B0.E5.8E.9F.E5.9E.8B.E7.BB.A7.E6.89.BF

    概述

    创建一个拥有指定原型和若干个指定属性的对象.

    Method of Object
    Implemented in JavaScript 1.8.5
    ECMAScript Edition ECMAScript 5th Edition

    语法

    Object.create(proto [, propertiesObject ])

    参数

    proto
    一个对象,作为新创建对象的原型.
    propertiesObject
    一个对象值,可以包含若干个属性,属性名为新建对象的属性名,属性值为那个属性的属性描述符对象.

    描述

    如果proto参数的值不是null或者对象值,则会TypeError异常.

    例子

    使用Object.create

    var o;
    
    // 创建一个原型为null的空对象
    o = Object.create(null);
    
    
    o = {};
    // 以字面量方式创建的空对象就相当于:
    o = Object.create(Object.prototype);
    
    
    o = Object.create(Object.prototype, {
      // foo会成为所创建对象的数据属性
      foo: { writable:true, configurable:true, value: "hello" },
      // bar会成为所创建对象的访问器属性
      bar: {
        configurable: false,
        get: function() { return 10 },
        set: function(value) { console.log("Setting `o.bar` to", value) }
    }})
    
    
    function Constructor(){}
    o = new Constructor();
    // 上面的一句就相当于:
    o = Object.create(Constructor.prototype);
    // 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码
    
    
    // 创建一个以另一个空对象为原型,且拥有一个属性p的对象
    o = Object.create({}, { p: { value: 42 } })
    
    // 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
    o.p = 24
    o.p
    //42
    
    o.q = 12
    for (var prop in o) {
       console.log(prop)
    }
    //"q"
    
    delete o.p
    //false
    
    //创建一个可写的,可枚举的,可配置的属性p
    o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
    
     
     

    使用Object.create实现原型继承

    下面的例子演示了如何使用Object.create来实现单继承.

    //Shape - superclass
    function Shape() {
      this.x = 0;
      this.y = 0;
    }
    
    Shape.prototype.move = function(x, y) {
        this.x += x;
        this.y += y;
        console.info("Shape moved.");
    };
    
    // Rectangle - subclass
    function Rectangle() {
      Shape.call(this); //call super constructor.
    }
    
    Rectangle.prototype = Object.create(Shape.prototype);
    
    var rect = new Rectangle();
    
    rect instanceof Rectangle //true.
    rect instanceof Shape //true.
    
    rect.move(); //Outputs, "Shape moved."
    
     
     

    如果你希望能继承到多个对象,则可以使用混入的方式.

    function MyClass() {
         SuperClass.call(this);
         OtherSuperClass.call(this);
    }
    
    MyClass.prototype = Object.create(SuperClass.prototype); //inherit
    mixin(MyClass.prototype, OtherSuperClass.prototype); //mixin
    
    MyClass.prototype.myMethod = function() {
         // do a thing
    };
    
     

    mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现.

    浏览器兼容性

     

     
    FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
    Basic support 5 4.0 (2) 9 11.60 5

     

    Polyfill

    if (!Object.create) {
        Object.create = function (o) {
            if (arguments.length > 1) {
                throw new Error('Object.create implementation only accepts the first parameter.');
            }
            function F() {}
            F.prototype = o;
            return new F();
        };
    }
    
     
     

    这个polyfill只实现了创建一个指定原型的对象的功能,而不能同时添加特定的属性,也就是没有实现原生的Object.create函数中的第二个参数.

  • 相关阅读:
    WEB上传大文件
    Java+超大文件上传
    php+文件夹上传
    php上传视频大文件
    每一个程序猿需掌握的20个代码命名小贴士
    Mysql整数运算NULL值处理注意点
    拓展欧几里得模板
    bzoj 1088 简单dfs
    决策树
    进程-IPC 管道 (一)
  • 原文地址:https://www.cnblogs.com/mliudong/p/3533958.html
Copyright © 2020-2023  润新知