如何在JavaScript中实现私有属性的写类方式(一)

之前讨论过JavaScript中的写类方式。但没有讨论私有的实现。这篇看下。

我们知道JS中私有属性的实现本质就是 var + closure。如下


代码如下:

function Person(n, a){
    // public
    this.name = n;
    // private
    var age = a;
    this.getName = function(){
        return this.name;
    }
    this.getAge = function(){
        return age;
    }
}

测试如下,age是私有的,使用点操作符无法获取到,而只能使用getName方法。


代码如下:

var p = new Person('jack',23);
console.log(p.age);  // undefined
console.log(p.getAge()); // 23

以上没什么稀奇的,下面我们使用一个工具函数来实现。 


代码如下:

/**
 * @param {String} className
 * @param {Function} classImp
 */
function $class(className, classImp){
    function clazz(){
        if(typeof this.init == "function"){
            this.init.apply(this, arguments);
        }
    }
    classImp.call(clazz.prototype);
    window[className] = clazz;
}

写一个类


代码如下:

$class('Person', function(){
    // 私有属性都定义在这
    var age = '';
    this.init = function(n, a){
        // 共有属性挂在this上,初始化
        this.name = n;
        // 私有属性初始化
        age = a;
    };
    this.getName = function(){
        return this.name;
    };
    this.getAge = function(){
        return age;
    }
});

new一个实例对象


代码如下:

var p = new Person('jack',23);
console.log(p.name); // jack 共有的可使用点操作符获取
console.log(p.age); // undefined 私有的不能通过点操作符获取
console.log(p.getAge()); // 23 私有的age只能通过共有的方法getAge获取

(0)

相关推荐

  • JavaScript中的私有成员

    JavaScript是世界上是被误解得最厉害的编程语言.有些人认为它不具备"信息隐藏"的能力,因为JavaScript的对象没有私有变量和方法.这是误解.JavaScript对象可以拥有私有成员,下面我们来看看怎么做.(SharkUI.com注:JavaScript并不是真正拥有私有.公有等等OOP的特性,这篇译文中提到的这些私有.公有.特权等特性,是利用JavaScript的其他特性(参看本文的"闭包"一节)"模拟"出来的.感兴趣的话可以搜索相

  • JavaScript中的公有、私有、特权和静态成员用法分析

    本文实例讲述了JavaScript中的公有.私有.特权和静态成员用法.分享给大家供大家参考.具体分析如下: 下面的内容是在<JavaScript.DOM高级程序设计>里面摘抄出来的,比较容易理解,特在此记录一下,便于入门Javascript的朋友们分享一下哈. 复制代码 代码如下: //构造函数 function myContructor(message){ this.myMessage = message; //私有属性 var separator = ' -'; var myOwner =

  • Javascript类定义语法,私有成员、受保护成员、静态成员等介绍

    其实通俗的讲类就是对象的模板,为了增强JS的OO特性,受mootoos框架启发我们可以使用一个JSON对象来描述这个对象的模板.在这个模板中我们可以模拟实现私有成员,受保护成员,静态成员. 这是一个在JS中模拟的类定义语法,代码中Class是一个自定义函数,它接受两个参数,第一个参数是类名.第二个参数是一个JSON用来一个对象的模板.在这个JSON对象中其中字段 "extend",,"initialize","static" 为一些预定义关键字,

  • Javascript 构造函数,公有,私有特权和静态成员定义方法

    复制代码 代码如下: //构造函数 function myClass(message) { //公有属性 this.myMessage = message; //私有属性 var _separator = ' -'; var _myOwner = this; //私有方法 function showMessage() { alert(_myOwner.myMessage); } //特权方法(也是公有方法) this.appendToMessage = function(appendMessag

  • JavaScript中的私有/静态属性介绍

    •模拟块级作用域 大家都知道在JavaScript中没有块级作用域的概念,我们可以通过使用闭包来模拟实现块级作用域,看下面的示例: 复制代码 代码如下: (function () { for (var i = 0; i < 10; i++) { //Do Nothing } alert(i); //输出10 })(); 第6行可以访问到for循环块中的变量i,如果我们稍微修改以上代码,把for循环块放置在闭包中,情况就不一样了: 复制代码 代码如下: (function () { (functi

  • Javascript 面向对象(一)(共有方法,私有方法,特权方法)

    私有方法:私有方法本身是可以访问类内部的所有属性的,即私有属性和公有属性.但是私有方法是不可以在类的外部被调用. 私有方法写法: 复制代码 代码如下: function myClass () { var private_attribute = initial_value; function private_method () { } var private_method2 = function () { } } 实例showpet()就是一个私有方法 复制代码 代码如下: var pet=fun

  • JavaScript 私有成员分析

    对象 JavaScript操作都是关于对象的.数组(Array)是对象,函数(Function)是对象.Object(类型)是对象.那么什么是对象呢?对象就是"名称-值"对(name-value).名称是字符串,值可以是字符串.数值.布尔值或对象(包括数组和函数).对象经常用哈希表实现,所以取值速度很快. 如果对象的一个值是函数(function),我们可以认为它是成员函数,当成员函数被调用时,this变量就会指向该对象.成员函数可以通过this变量访问对象的成员. 对象可以通过构造器

  • JavaScript 面向对象的 私有成员和公开成员

    其实很简单,废话少说,看了下面的代码及注释相信你就会一目了然! 复制代码 代码如下: //声明类,就是一个方法,其实在JavaScript中,命名空间.类.成员.... 一切皆对象 MyClass =function(){ var _this=this; //私有变量 var aa="11"; //公开变量 this.bb="22"; //私有方法 function fun1(){ alert(aa); alert(_this.bb); } //私有方法 var f

  • JavaScript 面向对象的之私有成员和公开成员

    上两节讲了 JavaScript 面向对象之命名空间 与 javascript 面向对象的JavaScript类,大家可以先看上面的再继续往下看. 其实很简单,废话少说,看了下面的代码及注释相信你就会一目了然! 复制代码 代码如下: //声明类,就是一个方法,其实在JavaScript中,命名空间.类.成员.... 一切皆对象 MyClass =function(){ var _this=this; //私有变量 var aa="11"; //公开变量 this.bb="22

  • JavaScript 模拟类机制及私有变量的方法及思路

    在使用一些 Javascript 框架时,或许会看到类似的代码 复制代码 代码如下: var MyClass = new Class({ initialize: function(param, ...) { this.param = param; ... }, func1: function(...) { ... } }); var myObj = new MyClass(param); myObj.func1(...); 这是一种典型的面向对象的类机制应用,与原生的 Javascript 类机

  • Javascript面象对象成员、共享成员变量实验

    1)Javascript对象成员实验: 复制代码 代码如下: var f = function d() { this.a = "a";/*这句运行后不存在f.a也不存在d.a存在一个window.a*/ var b = "b";/*局部变量*/ }; var o = { ff: function () { var a = "a"; /*局部变量*/ this.b = "b"; /*这句运行后存在o.b*/ } }; funct

  • javascript中定义私有方法说明(private method)

    一度以为在javascript的世界里,所有方法都是公有的,无法真正从技术上定义一个私有方法,今天又一次发现:其实我错了! 复制代码 代码如下: var Person = function(name,sex){     this.name = name;     this.sex = sex;          var _privateVariable = "";//私有变量         //构造器中定义的方法,即为私有方法     function privateMethod()

随机推荐