zoukankan      html  css  js  c++  java
  • javascript继承一览

    继承是每一个javascript工具库和框架都不可少的部分。来看看各大类库的实现吧。

    1,  prototype.1.7.1.js

    function extend(destination, source) {
        for (var property in source)
          destination[property] = source[property];
        return destination;
      }

    2, 鼎鼎大名的jQuery.2.0.3

    jQuery.extend = jQuery.fn.extend = function() {
        var options, name, src, copy, copyIsArray, clone,
            target = arguments[0] || {},
            i = 1,
            length = arguments.length,
            deep = false;
    
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
            deep = target;
            target = arguments[1] || {};
            // skip the boolean and the target
            i = 2;
        }
    
        // Handle case when target is a string or something (possible in deep copy)
        if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
            target = {};
        }
    
        // extend jQuery itself if only one argument is passed
        if ( length === i ) {
            target = this;
            --i;
        }
    
        for ( ; i < length; i++ ) {
            // Only deal with non-null/undefined values
            if ( (options = arguments[ i ]) != null ) {
                // Extend the base object
                for ( name in options ) {
                    src = target[ name ];
                    copy = options[ name ];
    
                    // Prevent never-ending loop
                    if ( target === copy ) {
                        continue;
                    }
    
                    // Recurse if we're merging plain objects or arrays
                    if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
                        if ( copyIsArray ) {
                            copyIsArray = false;
                            clone = src && jQuery.isArray(src) ? src : [];
    
                        } else {
                            clone = src && jQuery.isPlainObject(src) ? src : {};
                        }
    
                        // Never move original objects, clone them
                        target[ name ] = jQuery.extend( deep, clone, copy );
    
                    // Don't bring in undefined values
                    } else if ( copy !== undefined ) {
                        target[ name ] = copy;
                    }
                }
            }
        }
    
        // Return the modified object
        return target;
    };

    代码多了这么多,多了深拷贝和函数方式

    3, underscore

     _.extend = function(obj) {
        each(slice.call(arguments, 1), function(source) {
          if (source) {
            for (var prop in source) {
              obj[prop] = source[prop];
            }
          }
        });
        return obj;
      };

    4,庞大的angular

    function extend(dst) {
      var h = dst.$$hashKey;
      forEach(arguments, function(obj) {
        if (obj !== dst) {
          forEach(obj, function(value, key) {
            dst[key] = value;
          });
        }
      });
    
      setHashKey(dst,h);
      return dst;
    }

    5, 第一个项目中使用的ligerUI

    Function.prototype.ligerExtend = function (parent, overrides)
    {
        if (typeof parent != 'function') return this;
        //保存对父类的引用
        this.base = parent.prototype;
        this.base.constructor = parent;
        //继承
        var f = function () { };
        f.prototype = parent.prototype;
        this.prototype = new f();
        this.prototype.constructor = this;
        //附加属性方法
        if (overrides) $.extend(this.prototype, overrides);
    };

    6, dojo

    extend: function(ctor, props){
                // summary:
                //        Adds all properties and methods of props to constructor's
                //        prototype, making them available to all instances created with
                //        constructor.
                // ctor: Object
                //        Target constructor to extend.
                // props: Object
                //        One or more objects to mix into ctor.prototype
                for(var i=1, l=arguments.length; i<l; i++){
                    lang._mixin(ctor.prototype, arguments[i]);
                }
                return ctor; // Object
            },
    _mixin: function(dest, source, copyFunc){
                // summary:
                //        Copies/adds all properties of source to dest; returns dest.
                // dest: Object
                //        The object to which to copy/add all properties contained in source.
                // source: Object
                //        The object from which to draw all properties to copy into dest.
                // copyFunc: Function?
                //        The process used to copy/add a property in source; defaults to the Javascript assignment operator.
                // returns:
                //        dest, as modified
                // description:
                //        All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
                //        found in Object.prototype, are copied/added to dest. Copying/adding each particular property is
                //        delegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided.
                //        Notice that by default, _mixin executes a so-called "shallow copy" and aggregate types are copied/added by reference.
                var name, s, i, empty = {};
                for(name in source){
                    // the (!(name in empty) || empty[name] !== s) condition avoids copying properties in "source"
                    // inherited from Object.prototype.     For example, if dest has a custom toString() method,
                    // don't overwrite it with the toString() method that source inherited from Object.prototype
                    s = source[name];
                    if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
                        dest[name] = copyFunc ? copyFunc(s) : s;
                    }
                }
    
                if(has("bug-for-in-skips-shadowed")){
                    if(source){
                        for(i = 0; i < _extraLen; ++i){
                            name = _extraNames[i];
                            s = source[name];
                            if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
                                dest[name] = copyFunc ? copyFunc(s) : s;
                            }
                        }
                    }
                }
    
                return dest; // Object
            },

    除了5之外,基本上用到的是拷贝式继承。简单,通用(对数组,对象的继承也很好用,喜欢)

    6是原型继承

    当然了,还有一些其他方式,不过实际用的不多

    比如:

    对象冒充继承

    function Parent(firstname)  
    {  
        this.fname=firstname;  
        this.age=40;  
        this.sayAge=function()  
        {  
            console.log(this.age);  
        }  
    }  
    function Child(firstname)  
    {  
        this.parent=Parent;  
        this.parent(firstname);  
        delete this.parent;  
        this.saySomeThing=function()  
        {  
            console.log(this.fname);  
            this.sayAge();  
        }  
    }  
    var mychild=new  Child("李");  
    mychild.saySomeThing(); 

    采用call方法改变函数上下文实现继承

    function Parent(firstname)  
    {  
        this.fname=firstname;  
        this.age=40;  
        this.sayAge=function()  
        {  
            console.log(this.age);  
        }  
    }  
    function Child(firstname)  
    {  
      
        this.saySomeThing=function()  
        {  
            console.log(this.fname);  
            this.sayAge();  
        }  
       this.getName=function()  
       {  
           return firstname;  
       }  
      
    }  
    var child=new Child("张");  
    Parent.call(child,child.getName());  
    child.saySomeThing(); 

    以上就是查找各大类库继承方式和在网络上一些继承的方法。

    推荐:拷贝式继承,虽然性能差点。

  • 相关阅读:
    结构体后面不加 ; 的后果。
    swap的两种错误写法
    rewind和fseek作用分析
    16个get函数的用法。
    枚举的简单使用。
    小知识点
    网线头的做法
    内存和寄存器
    linux下service mongod start启动报错
    appium上下文切换、webview调试以及chromedriver/键盘等报错问题解决
  • 原文地址:https://www.cnblogs.com/pfzeng/p/4476134.html
Copyright © 2011-2022 走看看