面向对象特性的初步实现

1.封装 利用作用域封装变量

作用域的概念是一样的,for语句,if语句等这些作用域内定义的变量只能作用域内访问,函数内定义的变量只能函数内访问。

function ClassA() {
var a = 1;
}
var b = a; //无法访问。
var obj = new ClassA();
var c = obj.a; //new出一个对象也无法访问。

但是函数内部是可以访问到的

function ClassA() {
var a = 1;
var b = a; //内部可以访问
function func1() {
a = 100;
return a; //函数内部都可以访问,内部函数也能访问外函数的变量;
}
}

因为内部可访问,外部不可访问。则可以模拟面向对象的私有属性。在函数内部使用var关键字定义变量就可以了。

function ClassA() {

    var a = 1;         //私有属性  private
this.b = 100; //公共属性 public
}
内部使用var 和使用 this的区别。

this是个指向函数或对象自身的引用。上例中如下写法是一样的作用。

function ClassA() {
this.b = 1;
}
var obj = new ClassA(); //函数可看出构造方法,构造过程this.b = 1这条语句已经执行 //替换写法
function ClassA() {
}
var obj = new ClassA{};
obj.b = 1; //构造函数为空,于是外面补上设置属性值语句。 alert(obj.b); //此种写法obj.b这个属性变量自然是可以访问到的。

var只是简单的变量定义,上例中只是在函数内部定义了一个变量而已。

//本例中只是在两个不同的作用域空间定义了两个不同变量而已。没有任何关于对象引用的问题。
function ClassA() {
var a = 1;
}
var a = 100;
因此在函数内部使用var 和this定义变量可以模拟public 和private的作用。
但是这种公共变量和私有变量同其他面向对象语言不同的是,其他语言公共和私有变量都是对象真正的属性,只是控制了它的访问权限。但js中公共的变量是对象动态设置的一个属性,真正的属性,但是私有变量只是一个内部的普通变量而已。
 
如何使用私有变量和公共变量
使用的时候注意,因为私有变量只是一个简单的变量,使用的时候不能加this关键字,公共变量是真正的属性,使用的时候需要加this关键字
function ClassA() {
var a = 100;
this.b = 200;
this.func1 = function() {
return a + this.b; //正确用法
};
this.func2 = function() {
return a + b; //错误用法,this.b != b, 一个是对象的属性,一个是简单变量
};
this.func3 = function() {
return this.a + b; //错误用法,a只是一个简单变量
};
}
公共方法,私有方法
前面提到过js的属性可以存放任意东西,包括函数指针。所以用同样的方式也就可以实现私有方法和公共方法。
同样方法和简单变量一样,也是同样的var和this写法做到私有方法和公共方法
function ClassA() {
var func1 = function(){}; //私有方法
this.func2 = function(){}; //公共方法
}

内部使用的时候同样是公共的加this,私有方法不加this直接当普通函数使用。

function ClassB() {
var func1 = function(){}; this.func2 = function(){}; this.func3 = function() {
func1();
this.func2();
};
}

注意,同其他语言不通私有方法不能访问公共方法和公共变量。因为私有方法本质上只是个普通的方法,只是他定义在函数对象内部而已。除了位置在函数对象内部外,其他跟函数对象没任何关联。

function ClassA() {

    this.a = 100;

    var func1 = function(){
alert(this.a); //不能访问,此时this指的是func1这个普通函数对象
this.func2(); //不能访问,此时this指的是func1这个普通函数对象
};
this.func2 = function(){};
}

不管公共方法还是私有方法都只能在函数内部访问私有变量和私有方法。

function ClassB() {

    var a = 100;

    var func1 = function(){
alert(a);
}; this.func2 = function() {
func1(); //正常访问
return a; //正常访问
};
} var obj = new ClassB();
alert(obj.a); //无法访问
obj.func1(); //无法访问
私有变量的设计只是为了防止在对象外部被随意乱修改,并不是拒绝外部不能访问。
那么如何在函数外部访问私有成员变量呢?利用公共方法配合。下例演示一个常见的get和set方法
function ClassA() {

    var a = 100;                 //私有成员属性
this.getA = function(){ //公共get方法
return a;
};
this.setA = function(value){ //公共set方法
return a = value;
};
} var obj = new ClassA();
alert(obj.getA());
obj.setA(500);

公共方法,因为其定义在函数内部,函数内部定义的变量是可以访问到的。因为其本身是公共方法,可以被外部访问,这样便可以做到外部代码通过公共方法访问私有成员变量。

封装属性的设计是为了保护对象的完整性,也就是防止胡乱修改。上例这种做法可以做到真正的私有。但是有时候为了简化代码不这样做,而是用更简洁的方式达到。为每个变量名前面加一个下划线,向其他程序员表示这个是私有变量不好随意修改。其他程序员遵照原作者意图不去修改,这样通过一种默契的配合也实现了同样的结果。有一些面向对象语言也是没有private变量的概念,比如python,他们也大多采用加下划线的方式表示它是私有变量。
function ClassA() {

    this._a = 100;                 //文档化的私有成员属性
} var obj = new ClassA();
obj._a = 100; //看到下划线前缀的变量,这样的操作是不应该的。

javascript面向对象的写法02的更多相关文章

  1. javascript面向对象的写法03

    javascript面向对象的写法03 js一些基础知识的说明 prototype 首先每个js函数(类)都有一个prototype的属性,函数是类.注意类有prototype,而普通对象没有. js ...

  2. javascript面向对象的写法及jQuery面向对象的写法

    文章由来:jQuery源码学习时的总结 在JS中,一般的面向对象的写法如下: function Cao(){}//定义一个构造函数 Cao.prototype.init = function(){}/ ...

  3. javascript面向对象的写法01

    类和对象 其他面向对象的语言类的语法是内置的,自然而然的事.javascript中有对象,但没有类的语法,类的实现需要模拟出来. 只需要把对象想成一个容器,里面存放一些属性或方法,把类想象成一个对象的 ...

  4. [js高手之路] javascript面向对象写法与应用

    一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...

  5. 浅谈javascript面向对象

    我们常用的两种编程模式 POP--面向过程编程(Process-oriented programming) 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的 ...

  6. Javascript面向对象(封装、继承)

    Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...

  7. javascript面向对象(一):封装

    本文来自阮一峰 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学 ...

  8. JavaScript面向对象,及面向对象的特点,和如何构造函数

    1.面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是 ...

  9. JavaScript面向对象简介

    JavaScript面向对象简介 @(编程) [TOC] 1. 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是 ...

随机推荐

  1. Tomcat中查看JVM内存使用情况

    TOMCAT运行时,实时监控当前应用JVM的使用情况:可以利用Tomcat自带的应用manager查看详情. 首先,确认服务目录webapps下有manager应用 其次,需要创建角色manager和 ...

  2. Git学习系列之Git和TortoiseGit的区别

    不多说,直接上干货! Git和TortoiseGit的区别: TortoiseGit的安装和使用依赖Git. Git有且只有一个,就是linux最初创建的那个叫做Git的程序.现在的维护者的名字我懒得 ...

  3. intellij idea NoClassDefFoundError javax.swing.UIManager

    今天启动idea报 NoClassDefFoundError javax.swing.UIManager 可是明明配置好了java 环境 ,后来仔细想了一下只配置了java的bin目录在PATH里 随 ...

  4. 【Lua】遍历目录结果输出到页面中,刷新页面后出现500 Internal Server Error

    在通过lua获取目录json字符串,然后作为数据源,通过Extjs生成树的过程中,发生了一个奇怪的问题,那就是获取目录json字符串然后传递给Extjs生成树的这个过程中,一开始都是很顺利的就生成了, ...

  5. JS的正则表达式 - RegExp

    RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 正则表达式的创建方式 1.文字格式,使用方法如下: /pattern/flags  (即:/模式/标记) 2 ...

  6. 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17

    (十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...

  7. Hibernate中的CRUD操作

    1.添加数据操作 插入数据使用session对象的save()方法完成.   插入代码: @Test public void Test1(){ SessionFactory sessionFactor ...

  8. Signal Handling--ref

    http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_21.html A signal is a software interrupt d ...

  9. 移动端手势事件 hammer.JS插件

                      一.引入hammer.JS 1.下载地址:http://download.csdn.net/detail/webxiaoma/9872249 2.官网地址:http ...

  10. CSS基础知识---浮动,定位和盒模型

    转载请注明出处! 需要掌握的三个最重要的CSS概念是浮动,定位和盒模型. 盒模型概述: 页面上的每个元素都被看做一个矩形框(元素框or盒模型),这个框由元素内容,内边距,边框和外边距组成. 内边距出现 ...