美文网首页
JacaScript 私有变量(一)什么是私有变量

JacaScript 私有变量(一)什么是私有变量

作者: BertFu | 来源:发表于2016-11-24 22:42 被阅读91次

严格来讲,JavaScript 中没有私有成员的概念;所有对象属性都是公有的。不过,倒是有一个私有变量的概念。

任何在函数中定义的变量都可以认为是私有变量,因为不能再函数的外部访问这些变量。

私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。

function add(num1, num2) {
    var sum = num1 + num2;
    return sum;
}

在这个函数内容,有三个私有变量:num1、num2和sum。在函数内部可以访问这几个变量,但在函数外部则不能访问他们。

如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。

而利用这一点,就可以穿件用于访问私有变量的公有方法。

我们把有权访问私有变量和私有函数的公有方法称为 特权方法(privileged method)。有两种在对象上创建特权方法的方式。第一种是在构造函数中定义特权方法:

function MyObject() {
    // 私有变量
    var privateVariable = 10;

    function privateFunction() {
        return false;
    }

    // 特权方法
    this.publicMethod = function() {
        privateVariable++;
        return privateFunction();
    }
}

这个模式在构造函数内定义了所有私有变量和函数。然后,又继续穿件了能够访问这些私有成员的特权方法。能够在构造函数中定义特权方法,是因为特权方法作为闭包有权访问在构造函数中定义的所有变量和函数。

变量 privateVariable 和函数 privateFunction() 只能通过特权方法 publicMethod() 来访问。在创建 MyObject 的实例后,除了使用 publicMethod() 这一个途径外,没有任何办法可以直接访问 privateVariable 和 privateFunction()。

利用私有和特权,可以隐藏哪些不应该被直接修改的数据:

function Person(name) {


    this.getName = function() {
        return name;
    }

    this.setName = function(value) {
        name = value;
    }
}

var person = new Person("Bert")
alert(person.getName()) // "Bert"

person.setName("Greg");
alert(person.getName()) // "Greg"

上例代码的构造函数中定义了两个特权方法:getName() 和 setName() 。这两个方法都可以在构造函数外部使用,而且都有权访问私有变量 name。但在 Person 构造函数外部,没有任何办法访问 name。

由于这两个方法是在构造函数内部定义的,他们作为闭包能够通过作用域链访问 name。

私有变量 name 在 Person 的每一个实例中都不相同,因为每次调用构造函数都会重新创建者两个方法。

不过,在构造函数中定义特权方法也有一个缺点,那就是你必须使用构造函数模式来达到这个目的。

构造函数模式的切点是针对每个实例都会创建同样一组新方法,而使用静态私有变量来实现特权方法就可以避免这个问题。

相关文章

  • JacaScript 私有变量(一)什么是私有变量

    严格来讲,JavaScript 中没有私有成员的概念;所有对象属性都是公有的。不过,倒是有一个私有变量的概念。 任...

  • JacaScript 私有变量(二)静态私有变量

    通过在私有作用域中定义私有变量或函数,同样也可以创建特权方法: 这个模式创建了一个私有作用域,并在其中封装了一个构...

  • JacaScript 私有变量(三)模块模式

    模块模式是为单例创建私有变量和特权方法。所谓单例,指的就是只有一个实例对象。按照惯例, JavaScript 是以...

  • 作用域链

    查找私有变量 JS中的私有变量有且只有两种在私有作用域变量提升阶段,声明过的变量(或者函数)形参也是私有变量 [图...

  • JavaScript函数表达式——私有变量

    私有变量 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量,私有变量包括函数的参数,...

  • JavaScript函数_07 私有变量 + 私有函数 + 特权

    私有变量 使用 var 关键字声明在函数内部的变量称为私有变量 私有函数 在函数内部声明的函数称为私有函数 特权方...

  • iOS知识点总结

    一、Object-C中变量默认是私有的吗,方法默认是私有的吗? Object-C中既有私有方法,也有私有变量。 1...

  • JS—私有变量

    私有变量js中没有私有成员的概念,所有对象属性都是公有的,但是却是有私有变量的概念。任何函数中定义的变量都是私有变...

  • 2018-06-28 python 类的私有变量和私有方法

    转发python 类的私有变量和私有方法 类的私有变量和私有方法在Python中可以通过在属性变量名前加上双下划线...

  • 关于私有作用域的预解释

    如何区分私有变量还是全局变量: 在全局作用域下,预解释的时候,声明的变量是全局变量。 在"私有作用域中声明的变量"...

网友评论

      本文标题:JacaScript 私有变量(一)什么是私有变量

      本文链接:https://www.haomeiwen.com/subject/moripttx.html