我们先来看一个例子:

var Demo1 = function(val){
      this.value = val;
      this.getValue = function(){
            return this.value;
    }
};

var demo1Obj = new Demo1(1);
alert(demo1Obj.value);
demo1Obj.value = 0;
alert(demo1Obj.getValue()); 

Demo1的对象都会有一个value属性,在new的时候进行初始化。但是value本身却不是私有属性,我们可以通过'.value'的方式直接访问改属性。

但是如何将value属性私有化呢?

这里主要问题就是定义value变量直接定义在了this对象的属性上,这就让每个Demo1的对象都拥有了value属性,

其实我们可以将value定义为只存在于对象初始化时,让value变成Demo1函数中的局部变量,这样其他在函数外部就访问不到了,同时我们也给于其对象以访问该属性的接口

如:

var Demo1 = function(val){
      var value = val;
      this.getValue = function(){
            return value;
      };
      this.increment = function(inc){
           value += inc;
      }
};

var demo1Obj = new Demo1(1);
alert(demo1Obj.value);
demo1Obj.value = 0;
demo1Obj.increment(4);
alert(demo1Obj.getValue()); 

其实我们可以用到闭包的知识,

如下例所示:

var Demo2 = function(val){  var value = val;
    return {     increment: function(inc){      if(typeof inc === 'number'){        value += inc;      }     },
        getValue : function(){
            return val;
        }
    }
};

var demo2Obj = new Demo2(4);
alert(demo2Obj.getValue());  // 4alert(demo2Obj.val);//undefined

在Demo2中,实例化对象后发挥的是一个新的结构体,该结构体中的方法可以访问到他被创建时的上下文,就是我们所说的闭包。我们可以调用该闭包中的函数getValue,获取在实例化时传入的参数val的值。

注:这里在闭包中访问到的值,也不是该属性值的拷贝,而是其本身,因而increment中是可以对其进行修改的。

而且value的值是无法在外部直接获取到的,这就实现了对象属性的封装,同时也可以通过闭包的形式对其进行相应权限的操作。

总之,私有化属性的方法就是不将属性直接定义在this对象上,而是放到整个函数的局部变量中。

js私有化属性的更多相关文章

  1. js对象属性 通过点(.) 和 方括号([]) 的不同之处

    //    js对象属性 通过点(.) 和 方括号([]) 的不同之处 //    1.点操作符: 静态的.右侧必须是一个以属性名称命名的简单标识符.属性名用一个标识符来表示.标识符必须直接出现再js ...

  2. js获取属性

    js获取属性的方法: document.getElementById(); document.getElementsByTagname(); document.getElementsByClassna ...

  3. js中属性类型:数据属性与访问器属性

    js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...

  4. JS中"属性"的用法

    JS的属性和C#有相似之处  ! 使用get和set来进行属性的获取和设置 var obj={ a:"1", get age(){ return obj.a; }, set age ...

  5. JS修改属性,六种数据类型

    JS修改属性 一般修改单个属性是通过JS修改的,比较方便.改多个属性通过css样式改更方便. 1.特殊:通过JS修改包含"-"符号的属性,例如margin-top // 特殊 修改 ...

  6. 动态设置js的属性

    目标:js的属性名能够使用变量 举例:js对象object,当赋给该对象属性的时候能够採用下面方式 var object; object.prop1 = "value1"; obj ...

  7. Vue.js 计算属性是什么

    Vue.js 计算属性是什么 一.总结 一句话总结: 模板 表达式 维护 在模板中表达式非常便利,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护 ...

  8. javascript 私有化属性,和公共属性

    function TestClassA(name, number) { this.name = name; //public this.number = number; //public var ac ...

  9. Python 私有化属性

    # 对象的基本理论 # 什么事对象? # 万物皆对象 # 对象是具体物体 # 拥有属性 # 拥有行为 # 把很多零散的东西,封装成为一个整体 # 举例:王二小 # 属性 # 姓名 # 年龄 # 身高 ...

随机推荐

  1. css绝对定位、相对定位和文档流的那些事

    前言 接触html.和css时间也不短了,但每次用div+css布局的时候心里还是有点儿虚,有时候干脆就直接用table算了,很多时候用div会出现些不可预料的问题,虽然花费一定时间能够解决,但总不是 ...

  2. UVA 1613 K-Graph Oddity

    题意; 在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同. 分析: k=所有点中最大的入度.如果最大入度是偶数,则k+1.每个点可选 ...

  3. Oracle存储过程的一点使用总结

    [博客文章背景]博客开通已经1.2年了,一直碍于技术能力,不敢献丑.想起1年前在一个数据处理相关项目结束后,代金排主管让我做一个数据库开发总结文档和一个Toad.PL/SQL Developer工具的 ...

  4. Linux修改Shell命令提示符及颜色

    Linux修改Shell命令提示符及颜色 1. Linux登录过程中加载配置文件顺序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~ ...

  5. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  6. jquery读取本地文件

    <html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...

  7. Android 软键盘小知识点

    chatText = (EditText) findViewById(R.id.chatText); chatText.setOnKeyListener(new OnKeyListener() { p ...

  8. pycharm的激活

    ——————转———— Pycharm5注册方式   0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法 ...

  9. 《彻底搞定C指针》文档整理

    一.变量存储 #include <stdio.h> int main(void) { ; printf(“%d\n”, i); printf(“%d\n”, &i); //十进制打 ...

  10. Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)

    ----我的生活,我的点点滴滴!! 部门领导突然心血来潮,想在android平台上做应用,但是我们大多产品属于嵌入式(本吊只负责写写应用,苦比的被强行顶过来搞这,由于这还得领导吵了一架,架虽然吵完了, ...