zoukankan      html  css  js  c++  java
  • JavaScript 原型3

    抽象类

    <script language="JavaScript" type="text/javascript">
        < !--
        //定义extend方法
        Object.extend = function(destination, source) {
            for (property in source) {
                destination[property] = source[property];
            }
            return destination;
        }
        Object.prototype.extend = function(object) {
            return Object.extend.apply(this, [this, object]);
        }
        //定义一个抽象基类base,无构造函数
        function base() {}
        base.prototype = {
            initialize: function() {
                this.oninit(); //调用了一个虚方法
            }
        }
        //定义class1
        function class1() {
            //构造函数
        }
        //让class1继承于base并实现其中的oninit 方法
        class1.prototype = (new base()).extend({
            oninit: function() { //实现抽象基类中的oninit虚方法
                //oninit函数的实现
            }
        });
        //-->
        
    </script>

    这样,当在class1 的实例中调用继承得到的initialize方法时,就会自动执行派生类中的oninit()方法。从这里也可以看到解释型语言执行的特点,它们只有在运行到某一个方法调用时,才会检查该方法是否存在,而不会向编译型语言一样在编译阶段就检查方法存在与否。JavaScript 中则避免了这个问题。

    以prototype-1.3.1 为例,其中定义了一个类的创建模型:

    //Class是一个全局对象,有一个方法create,用于返回一个类
    var Class = {
        create: function() {
            return function() {
                this.initialize.apply(this, arguments);
            }
        }
    }

    这里Class是一个全局对象,具有一个方法create,用于返回一个函数(类),从而声明一个类,可以用如下语法:

    var class1=Class.create();

    这个函数也是一个类的构造函数,当new这个类时便会得到执行。它调用了一个initialize方法,从名字来看,是类的构造函数。而从类的角度来看,它是一个虚方法,是未定义的。但这个虚方法的实现并不是在派生类中实现的,而是创建完一个类后,在prototype 中定义的,例如prototype可以这样写:

    var class1 = Class.create();
    class1.prototype = {
        initialize: function(userName) {
            alert(“hello, ” + userName);
        }
    }

    这样,每次创建类的实例时,initialize方法都会得到执行,从而实现了将类的构造函数和类成员一起定义的功能。

    <script type="text/javascript">
        var Class = {
            create: function() {
                return function() {
                    this.initialize.apply(this, arguments);
                }
            }
        }
        var class1 = Class.create();
        class1.prototype = {
            initialize: function(userName) {
                alert("hello," + userName);
            }
        }
        var c = new class1("hongda");
    </script>
  • 相关阅读:
    牛客OI周赛13-提高组 比赛总结
    CF1260C Infinite Fence 题解(扩欧)
    Comet OJ
    CF1151F Sonya and Informatics (计数dp+矩阵优化)
    矩阵 总结
    Educational Codeforces Round 77 比赛总结
    Codeforces 矩阵题 题单
    01欢迎进入软件构建的世界
    02用隐喻来充分地理解软件开发
    02Vs2013常用路径配置
  • 原文地址:https://www.cnblogs.com/hongdada/p/2966545.html
Copyright © 2011-2022 走看看