`
holdbelief
  • 浏览: 707519 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟私有属性

阅读更多

模拟私有属性

现在介绍闭包如何帮助模拟私有成员。正常情况下,无法从函数以外访问函数内的本地变量。函数退出之后,由于各种实际的原因,该本地变量将永远消失。但是,如果该本地变量被内部函数的闭包捕获,它将生存下来。这一事实是模拟JavaScript私有属性的关键。假设有一个Persion类:

function Persion(name, age)
{
        this.getName = function(){return name;};
        this.setName = function(newName){name = newName;};
        this.getAge = function(){return age;};
        this.setAge = function(newAge){age = newAge;};
}

 参数name和age是构造函数Persion的本地变量。Persion返回时,name和age应当永久消失。但是,它们被作为Persion实例的方法而分配的四个内部函数捕获,实际上这会使name和age继续存在,但只能严格地通过这四个方法访问它们。因此,您可以:

 

var ray = new Persion('Ray', 31);
alert(ray.getName());
alert(ray.getAge());
ray.setName("Younger Ray");
//Instant rejuvenation
ray.setAge(22);
alert(ray.getName() + " is now " + ray.getAge() + "years old.");

 未在构造函数中初始化的私有成员可以成为构造函数的本地变量,如下所示:

function Persion(name, age)
{
        var occupation;
        this.getOccupation = function() //accessors for name and age
        {
                return occupation;
        }
        this.setOccupation = function(newOcc)
        {
                occupation = newOcc;
        }
}

 

 注意,这些私有成员与我们期望从C#中产生的私有成员略有不同,在C#中,类的公用方法可以访问它的私有成员。但是在JavaScript中,只能通过在其闭包内拥有这些私有成员的方法来访问成员(由于这些方法不同于普通的公用方法,它们通常被称为特权方法),因此,在Persion的公用方法中,仍然必须通过私有成员的特权访问器方法才能访问私有成员:

Persion.prototype.somePublicMethod = function()
{
        // doesn't work!
        // alert(this.name);
        // this one below works
        alert(this.getName);
}

 Douglas Crockford 是著名的发现(或者也许是发布)使用闭包来模拟私有成员这一技术的第一人。他的网站  javascript.crockford.com   包含有关 JavaScript 的丰富信息,任何对 JavaScript 感兴趣的开发人员都应当仔细研读。

 

下一节:从类继承

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    javascript使用闭包模拟对象的私有属性和方法

    下面通过一个简单的例子来说明如何使用闭包来模拟私有属性和方法: ```javascript function createBook() { var page = 100; // 私有属性,外部不可访问 // 这个函数可以访问私有属性 page function _page() { ...

    JavaScript之私有属性,私有函数,函数实现对外不可见

    在JavaScript编程中,私有属性和私有函数是实现封装和数据隐藏的关键概念。这些特性使得我们可以更好地控制代码的访问权限,防止外部直接修改或访问内部状态,从而增强程序的安全性和稳定性。在JavaScript中,虽然...

    ProtectJSJavaScript中真正私有的属性和方法

    综上所述,ProtectJS库通过JavaScript的闭包机制实现了模拟私有属性和方法的功能,为开发者提供了更安全、更模块化的代码组织方式。它在浏览器和Node.js环境下均适用,使得私有化编程在JavaScript世界中成为可能。...

    ES6 Class中实现私有属性的一些方法总结

    3. Symbol:利用Symbol数据类型可以创建唯一的标识符,使用这些标识符作为对象的属性名可以模拟私有属性。这些属性不能通过常规的遍历方法访问,但是它们可以通过`Object.getOwnPropertySymbols`方法被访问到。所以...

    ES5 模拟 ES6 的 Symbol 实现私有成员功能示例

    如果没有Symbol,我们还可以通过生成随机字符串来模拟私有属性。例如: ```javascript var Person = (function() { var _name = "00" + Math.random(); function Person(name) { this[_name] = name; } ...

    JavaScipt最佳入门教程(中文版)

    3. 面向对象编程的实现:在JavaScript中,通过构造函数、原型、闭包和模拟私有属性等方式来实现面向对象编程。 4. JavaScript中的编码技巧:这包括理解作用域、闭包、异步编程模式、以及如何使用新ES6的特性。 5. ...

    javaScript 利用闭包模拟对象的私有属性

    JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument

    JAVASCRIPT-使用面向对象的技术创建高级 Web 应用程序

    我们介绍了JavaScript对象作为词典的概念、函数的重要性、构造函数与原型、闭包以及如何模拟私有属性和命名空间。这些概念和技术对于任何希望使用现代Web开发技术构建复杂应用的开发者来说都是必不可少的。随着Web...

    老生常谈python的私有公有属性(必看篇)

    - Python没有严格的私有属性概念,但是可以通过命名约定和名称改写机制来模拟私有属性的功能。 - 在实际开发中,应该合理利用这些特性来保护类的数据结构,提高程序的可维护性和健壮性。 总之,了解Python中的私有...

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

    总结来说,这个例子展示了如何在JavaScript中通过闭包和构造函数模拟私有属性,以及如何利用`$class`工具函数实现类的继承和私有属性的保护。这种方式虽然不是语言原生支持的私有成员,但可以有效地在类的设计中实现...

    浅谈js继承的实现及公有、私有、静态方法的书写

    同时,通过闭包可以模拟私有属性和方法,静态属性和方法则通过在构造函数上直接定义。理解这些概念对于编写可维护和扩展的JavaScript代码至关重要。在实际开发中,开发者可以根据需求选择合适的继承策略,并灵活运用...

    08-python-重定义森林火灾模拟-接口-共有,私有和特殊方法和属性

    在"08.12-python-共有,私有和特殊方法和属性.ipynb"文件中,可能会详细介绍这些方法的作用,以及如何在森林火灾模拟中使用它们来实现特定行为。 在森林火灾模拟的场景下,共有方法可能包括获取当前森林状态、开始...

    Lua类工具包《BjaClassTool》,完全模拟,公有私有属性/静态,继承,运算符重载等等!

    同时,它也支持公有和私有属性的概念,公有属性可以直接访问,而私有属性通常只能在类内部访问,这增强了代码的封装性。 其次,继承是面向对象编程的重要特性。`BjaClassTool`允许一个类从另一个类派生,子类可以...

    Advanced_Descriptors-0.5.3-cp27-cp27mu-manylinux1_x86_64.whl.zip

    通过使用描述符,可以实现数据验证、缓存计算结果、模拟私有属性等高级功能。在Python的`__get__`、`__set__`和`__delete__`方法中定义描述符,可以控制属性的获取、设置和删除操作。 总之,这个压缩包提供的...

    第十三单元.pptx_电子版_pptx版

    在实际开发中,`Proxy`可以用于实现数据的实时观察、数据的透明化缓存、模拟私有属性等高级功能,极大地丰富了JavaScript的编程模式。对于互联网应用来说,利用`Proxy`优化用户体验、增强数据安全性等方面都有重要...

    谈谈Python:为什么类中的私有属性可以在外部赋值并访问

    Python作为一种高级语言,支持类与对象的概念,并提供了一种特殊的命名规则用于模拟私有成员的概念,即通过在属性名前加上两个下划线`__`来表示该属性为私有属性。然而,在实际应用中,这种所谓的“私有属性”并不能...

    javascript中的类理解

    JavaScript 中的类并没有像 Java 或 C# 那样的严格访问修饰符,但可以通过约定俗成的方式来模拟私有属性和方法,例如使用下划线前缀 `_`(如 `_privateVar`)表示非公开成员。 8. **静态方法和属性** 类还可以...

    javascript 入门教程

    由于JavaScript中的一切都是公开的,模拟私有属性可以通过闭包来实现。通过闭包,可以隐藏某些变量或方法,使它们只能通过特定的接口访问。 ```javascript function createPerson(name) { var _name = name; // ...

Global site tag (gtag.js) - Google Analytics