zoukankan      html  css  js  c++  java
  • javascript继承(八)-封装

    这个系列主要探讨的是javascript面向对象的编程,前面已经着重介绍了一下js的继承,下面想简单的说一下js如何实现封装的特性。

    我们知道面向对象的语言实现封装是把成员变量和方法用一个类包围起来,对类中变量的访问只能通过已定义的接口。封装可以算是一种信息隐藏技术,java通过private修饰符将成员变量私有化,并提供对外修改的接口,以控制类中的成员变量的访问和修改。当然在这些方法中可以对数据进行一些加工。

    在前面文章已经介绍了js的属性问题,那么在js中如何实现对类的属性隐藏呢?这里封装有会有什么蔽端。

    下面看一下实现封装的代码:

    var Person = (function(){
        //定义私有方法,相当于private方法,只能在内部访问
        function hello(){
            alert('hello world!');
        }
        return function(){
            //定义私有属性,相当于private属性,只能在公有方法内部访问
            var name,age;
            //定义公有方法,相当于public方法,可以在类的实例中方法
            this.getName = function(){
                return name;
            };
            this.setName = function(newName){
                name = newName;
            };
            this.getAge = function(){
                return age;
            }
            this.setAge = function(newAge){
                age = newAge;
            };
            this.say = hello;
            this.introduce = function(){
                alert('my name is :'+this.getName());
            }
        }
    })()
    
    var p = new Person();
    p.say(); //hello world
    p.setName('xiaoming');
    p.introduce(); //my name is : xiaoming

    封装的好处这儿就不用多说了,但在js里使用一定得注意,避免过度封装。下面看一下封装对继承有没有什么影响。

    代码如下:

    var Person = (function(){
        //定义私有方法
        function hello(){
            alert('hello world!');
        }
        return function(){
            //定义私有属性,相当于private属性
            var name,age;
            //定义公有方法,相当于public方法
            this.getName = function(){
                return name;
            };
            this.setName = function(newName){
                name = newName;
            };
            this.getAge = function(){
                return age;
            }
            this.setAge = function(newAge){
                age = newAge;
            };
            this.say = hello;
            this.introduce = function(){
                alert('my name is :'+this.getName());
            }
        }
    })()
    
    Person.prototype.call = function(){
        this.say();
    }
    
    var Student = function(){
        Person.call(this);
    }
    for(var i in Person.prototype){Student.prototype[i] = Person.prototype[i]}
    
    var s = new Student();
    s.setName('xiaoli');
    s.getName();//xiaoli
    s.call();//helloworld

    可以看到Student类继承了Person类,获得了Person类的公有方法和共有方法即prototype定义的方法。由于JavaScript并不原生支持封装,所以在JavaScript中实现封装一定要注意复杂性的问题。

  • 相关阅读:
    凸透镜和凹透镜为什么分别对光有会聚作用和发散作用
    平面镜成像
    行政 申论 大纲
    专业科 大纲
    linux command --- terminal common commands
    3D VR卡镜的使用方法
    Structure From Motion(二维运动图像中的三维重建)
    双目摄像机
    对比手机SLAM和机器人SLAM
    3D indoor map positioning with a smartphone image
  • 原文地址:https://www.cnblogs.com/lj915/p/3792242.html
Copyright © 2011-2022 走看看