文档章节

JavaScript模拟Java类继承

smalldragonluo
 smalldragonluo
发布于 2014/06/17 11:39
字数 523
阅读 187
收藏 8

    javascript采用原型继承的方式继承一个类(javascript没有类这个概念,暂时这么称呼吧),但一些使用过Java的程序员可能习惯使用经典的类继承,但javascript原生并不支持这种方式,因此需要手动实现。我是通过定义一个定义类的函数实现的,由于javascript没有访问修饰符,因此如果需要使用到private成员,请使用闭包。

 

/*将一个对象的自有属性复制到另一个对象的方法*/
        function merge(from, to){
            for(var i in from){
                if(from.hasOwnProperty(i)){
                    to[i] = from[i];
                }
            }
        }

        /*用于定义一个类
         *参数:构造函数,继承的父类, 属性, 静态属性, 是否为单例模式
         */
        function defineClass(constructor, parent, properties, statics, isSingleton){

            /*使用代理函数,这样父类采用this.xx定义的引用类型将每个实例独有*/
            var oldConstructor = constructor;

            /*如果为单例模式,保存实例,并在以后的调用中返回此实例*/
            if(isSingleton){
                var instance;
                constructor = function(){
                    if(instance) return instance;
                    parent.apply(this, arguments);
                    oldConstructor.apply(this, arguments);
                    instance = this;
                }
            }
            else{
                constructor = function(){
                    parent.apply(this, arguments);
                    oldConstructor.apply(this, arguments);
                }
            }

            /*设置原型属性,这意味着传入的构造函数的原型属性将被覆盖
             *重要:parent内部需要检测参数合理合法性
             */
            constructor.prototype = new parent();
            /*将自有属性复制到原型中
             *将静态属性复制到构造函数中,这意味着将不会继承parent的静态属性
             */
            merge(properties, constructor.prototype);
            merge(statics, constructor);
            /*将构造函数更改为当前构造函数
             *将parent的引用保留
             */
            constructor.prototype.constructor = constructor;
            constructor.prototype.parent = parent;
            return constructor;
        }

    

    注意,不能用此方法继承如Array等内置对象,如果你想通过定义一个类扩展Array的功能,那么在调用Array的某些方法时会出现问题,比如concat返回的数组直接包含两个对象,而不是包含两个对象中的元素。原因是虽然子类的原型链包含Array.prototype,但毕竟不是由Array直接构造,在调用某些方法时可能不会按照原始的方式执行。

© 著作权归作者所有

共有 人打赏支持
smalldragonluo
粉丝 2
博文 9
码字总数 5320
作品 0
南岸
JavaScript 中的继承:ES3、ES5 和 ES6

选择一种继承方式 JavaScript 是一门动态语言,动态意味着高灵活性,而这尤其可以体现在继承上面。JavaScript 中的继承有很多种实现方式,可以分成下面四类: Mixin 模式,即属性混入,从一个...

天方夜
07/04
0
0
JS中class的实现方式,另模拟dojo.declare

首先写一个简单的类。 function Animal(nickName){ }Animal.prototype.canMiaomiao=false;Animal.prototype.eat=function(){console.log("animal eat");};Animal.prototype.sleep=function()......

xpbug
2012/07/17
0
0
swt browser控件与java交互

1、java调用browser页面里的js [javascript] view plain copy final Browser browser = new Browser(shell, SWT.FILL_WINDING); browser.evaluate("fun()");//fun是一个定义好的js函数 2、j......

xiaomin0322
06/12
0
0
Cocos2d-JS中JavaScript继承

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求。由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-J...

智捷课堂
2015/03/17
0
0
React Native Android 源码分析之启动过程

前言 这篇开始将分析 React Native 是在 Android 端的启动过程是怎么样。 用过 React Native 的小伙伴都知道,React Native 是可以使用 JS 来编写一份代码,并可以同时跑在 Android 和 iOS ...

骑摩托马斯
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
10分钟前
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
12分钟前
0
0
Nginix开启SSL支持HTTPS访问(自签名方法)

Nginix开启SSL支持HTTPS访问(自签名方法) 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器...

openthings
28分钟前
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部