zoukankan      html  css  js  c++  java
  • javascript面向对象继承方式分享

    1、javascript的大段文本块声明

     1 $(document).ready(
     2       function ()
     3       {
     4           var str = '\
     5           helo me fdsaf fdsaf\
     6           me\
     7           \
     8           test\
     9           ';
    10           alert(str);
    11       }
    12     );
    13 

    这个和@大大柳树 曾经遇到过该问题。

    2、Douglas Crockford实现的一个巧妙地类模式的继承。加了些注释方便理解。

    理解这段函数需要的基础知识

    (1)、Function.prototype增加一个公有方法。所有由类的扩充的函数都可以使用它。它有一个名称和一个函数,并把它们增加到了函数的prototype上。

    (2)、if,while 这些需要判断函数的语句,数字0作为条件转换为false,>0转换为true。

    实现继承函数
    //辅助方法
    Function.prototype.method = function (name, func) {
        
    this.prototype[name] = func;
        
    return this;
    };
    //比较复杂的函数= =
    //
    可以实现快捷的继承。也可以让选择性的调用父对象的函数。
    Function.method('inherits'function (parent) {
        
    var d = {};
        
    this.prototype = new parent();
        
    var p = this.prototype;
        
    //一个特权方法可以调用父类的方法。
        this.method('uber'function uber(name) {
            
    //判断该方法是否存在
            if (!(name in d))
            {
                d[name] 
    = 0;
            }
            
    var f, r, t = d[name], v = parent.prototype;
            
    //是否执行过
            if (t)
            {
                
    //如果有执行过
                while (t)
                {
                    v 
    = v.constructor.prototype;
                    t 
    -= 1;
                }
                f 
    = v[name];
            }
            
    //首次执行
            else
            {
                f 
    = p[name];
                
    //如果指向当前原型的方法,调用父对象的方法
                if (f == this[name])
                {
                    f 
    = v[name];
                }
            }
            
    //巧妙而恶心的调用堆栈记录
            d[name] += 1;
            //这个函数也很巧妙,arguments不是一个真正的数组,所以必须再一次使用apply来调用数组的slice的方法。
            r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
            alert(d[name]);
            
    return r;
        });
        
    return this;
    });
    //只继承父类特定函数的辅助函数
    Function.method('swiss'function (parent) {
        
    for (var i = 1; i < arguments.length; i += 1)
        {
            
    var name = arguments;
            
    this.prototype[name] = parent.prototype[name];
        }
        
    return this;
    }
    调用代码
    function User() {
        
    this.name = "user";
    }
    User.method(
    "sayYouName"function () { alert("from:" + this.name); });
    function Man() {
        
    this.name = "man";
    }
    Man.inherits(User);
    Man.method(
    "sayYouName",
    function () {
        
    this.uber("sayYouName");
        alert(
    "and i am man");
    });

     3、dean edwards base.js的类继承方式

    这个类继承的方式会更优雅些,如果方法被覆盖的情况下更是如此,只需this.base调用即可。不用显示写出方法名

    代码
    //base.js begin
    var Star = Base.extend({
        constructor: function (name) {
            
    this.name = name;
        },
        name: 
    "",
        say: function (message) {
            alert(
    this.name + "" + message);
        }
    });

    var Sun 
    = Star.extend({
        say: function (message) {
            
    this.base(message);
            alert(
    "base over");
        }
    });

    调用代码

    (new Sun("tom")).say("hello world!");
  • 相关阅读:
    数的划分终极版--背包法解决各类数的划分
    128.最长公共子序列
    整数划分类型题目--专练
    主函数
    LED类代码
    APM2.8地面站下载地址
    多文件函数调用
    流水灯
    APM的3DR无线数传的安装和调试
    闪烁的LED灯
  • 原文地址:https://www.cnblogs.com/brightwang/p/1924142.html
Copyright © 2011-2022 走看看