zoukankan      html  css  js  c++  java
  • firefox-Developer开发者站点——关于Object.create()新方法的介绍

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。

    语法

    Object.create(proto, [ propertiesObject ])

    参数

    proto
    一个对象,作为新创建对象的原型。
    propertiesObject
    可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。

    抛出异常

    如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常。

    例子

    使用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(1, 1); //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函数没有给出,需要由你实现。一个和 mixin 很像的函数是  jQuery.extend

    使用Object.create 的 propertyObject 参数

    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 } });

    Polyfill

    本polyfill的实现基于Object.prototype.hasOwnProperty

    if (typeof Object.create != 'function') {
      // Production steps of ECMA-262, Edition 5, 15.2.3.5
      // Reference: http://es5.github.io/#x15.2.3.5
      Object.create = (function() {
        //为了节省内存,使用一个共享的构造器
        function Temp() {}
    
        // 使用 Object.prototype.hasOwnProperty 更安全的引用 
        var hasOwn = Object.prototype.hasOwnProperty;
    
        return function (O) {
          // 1. 如果 O 不是 Object 或 null,抛出一个 TypeError 异常。
          if (typeof O != 'object') {
            throw TypeError('Object prototype may only be an Object or null');
          }
    
          // 2. 使创建的一个新的对象为 obj ,就和通过
          //    new Object() 表达式创建一个新对象一样,
          //    Object是标准内置的构造器名
          // 3. 设置 obj 的内部属性 [[Prototype]] 为 O。
          Temp.prototype = O;
          var obj = new Temp();
          Temp.prototype = null; // 不要保持一个 O 的杂散引用(a stray reference)...
    
          // 4. 如果存在参数 Properties ,而不是 undefined ,
          //    那么就把参数的自身属性添加到 obj 上,就像调用
          //    携带obj ,Properties两个参数的标准内置函数
          //    Object.defineProperties() 一样。
          if (arguments.length > 1) {
            // Object.defineProperties does ToObject on its first argument.
            var Properties = Object(arguments[1]);
            for (var prop in Properties) {
              if (hasOwn.call(Properties, prop)) {
                obj[prop] = Properties[prop];
              }
            }
          }
    
          // 5. 返回 obj
          return obj;
        };
      })();
    }

    规范

    规范版本规范状态注解
    ECMAScript 5.1 (ECMA-262)
    Object.create
    Standard Initial definition. Implemented in JavaScript 1.8.5
    ECMAScript 2015 (6th Edition, ECMA-262)
    Object.create
    Standard  

    浏览器兼容性

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

    相关链接

  • 相关阅读:
    asp.net大文本保存 framework4.0
    temp文件夹权限对ASP网站以及ASP.NET网站的影响【转载】
    将access数据转移到sql server
    MVC图片上传、剪辑、缩略、水印
    魔兽War3按键精灵Ⅱ(201294)
    PHP中应用CKEditor和CKFinder上传图片读取图片
    C#中get和set个人理解
    asp.net验证码实现
    转三篇文章关于php中session机制
    ORM组件 ELinq (五)映射配置之XML
  • 原文地址:https://www.cnblogs.com/koleyang/p/5038402.html
Copyright © 2011-2022 走看看