JS中的私有成员-01

JS中是没有私有成员的概念的,一个对象的所有的属性都是公有的,任何函数都可以访问,修改,删除这些属性或者是为对象添加新的属性(成员).

主要有两种方式为一个新的对象添加成员,

1.构造函数(通常用来实例化公有实例变量,其中this用来向新对象添加成员)

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
2.原型(通常用来添加公有的方法)

    Person.prototype.sayHi = function(){
        alert("hello");
    }

上述两种方式添加的对象的成员都是公有的.
JS虽然没有私有成员的概念,但是却有私有变量的概念.任何在函数中定义的变量

都是私有变量,在函数的外部无法访问这些私有变量,其中包括:函数的参数

(parameter),函数中定义的变量(var),函数内部定义的函数(inner function).

如:
    function sum(num1,num2){
        var result = num1 + num2;
        return result;
    }
    形参num1,num2和局部变量result是私有变量,只可以在函数内部访问,不可以在函数外部访问.

    构造函数中的私有变量实现隐藏数据:

    function Student(parameter1,parameter2){
        // 定义公有成员name,score
        this.name = parameter1;
        this.score = parameter2;
        // 定义私有变量和私有函数
        //通过私有变量来实现隐藏那些不应该被直接访问,修改的数据
        var classes = "测绘132";
        var school = "淮海工学院";
        function getClasses(){
            console.log(classes);
        }
        // 特权方法: 有权访问私有变量和私有函数的公有方法.
        //通过特权方法(即一个闭包)来访问私有变量,私有函数,
        //除此之外,没有其他的方式
        this.publicMethod = function(){
            console.log(school);
            getClasses();
        }
    }
    var weigenshang = new Student("魏根上",93);
    // weigenshang.getClasses();        //报错,不可以访问私有函数.
    console.log(weigenshang.school);    //unfined
    console.log(weigenshang.classes);   //unfined
    console.log(weigenshang.name);      //"魏根上"
    console.log(weigenshang.score);     //93
    weigenshang.publicMethod();         // 通过特权方法来访问私有成员
    ----------------------------------
    再如:
    function Person(name){
        this.getName = function(){
            return name;
        };
        this.setName = function(newName){
            name = newName;
        };
    }
    var tom = new Person("Tom");
    alert(tom.name);  // undefined 
    Person()定义了两个特权方法,getName(),setName()都可以在外部访问构造函数内部的私有变量name,因为这两个函数都是闭包,其作用域链中包含Person()函数的词法环境,

实际上name只是Person()构造函数中的私有变量,并不是person类对象的属性,这一点可以通过tom.name = undefined看出来,我们只是把这种私有变量看成是对象隐藏的属性,并通过给对象添加特权方法(即闭包)来访问这些隐藏的属性(即私有变量),


但是在构造函数中定义特权方法有一个缺点就是必须使用构造函数模式才可以,而构造函数模式的缺点就是针对每一个实例都会创建同样一组新方法.

使用静态私有变量实现特权方法就可以避免这个问题,这也是下一章的内容.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值