转自:
http://v1.djasp.net/static/zh/2055.stm
JavaScript 是世界上最被误解的语言。
很多人认为它缺乏信息隐藏的特性所以对象不能有私有实例变量和方法。但这是一个误解。JavaScript对象同样可以拥有私有变量。下面就讲解一下:
对象
JavaScript根本上都是关于的对象(Object)的。数组(Array)是对象,函数(Function)是对象,Object就不说了。那什么是对象?对象是名称-值的配对的集合。名称是字符串,值可以是字符串、数字、布尔值和对象(包括数组和函数)。对象常常实现为哈希表以快速存取值。
如果一个值是函数,我们可以将它视为方法method。当调用一个对象的方法时,this 变量就会被设为该对象。这个方法就可以通过this变量访问实例变量。
对象是由构造器constructor产生的,它是初始化对象的函数。构造器提供了其它语言中类提供的特性,包括静态方法和变量。
公共成员
对象的成员都是 public 公共成员。任何函数都可以访问、修改或者删除这些成员。有两种主要的途径给新的对象加入成员:
构造器中
这个技术一般用来初始化公共实例变量。构造器的this变量是用来向对象添加成员的。
function Container(param) { this.member = param;}这样,如果我们构造一个新的对象
var myContainer = new Container(’abc’);那么myContainer.member 就会包含’abc’。
原型中
这个技巧一般用来添加公共方法。当一个成员被检索且没有在对象中发现的时候,那么它就会从对象构造器的 prototype 成员中去获取它。这个原型机制可用来实现继承。它也保存内存。要为一个构造器生成的所有对象加入一个方法,将函数加入构造器的prototype 中:
Container.prototype.stamp = function (string) {
return this.member + string;
}这样,我们可以调用这个方法
myContainer.stamp(’def’)它会返回’abcdef’.
私有成员
私有Private成员要由构造器生成。构造器中的普通的var变量和参数都成为私有成员。
function Container(param) {
this.member = param;
var secret = 3;
var self = this;}这个构造器有三个私有实例变量:param, secret, 和 self。它们被附加到了对象上,但它们无法从外部访问,同时它们也无法被这个对象的公共方法所访问。他们只对私有成员可见。私有方法则是构造器内部的函数。
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var self = this;
}私有方法 dec 检查 secret 实例变量。如果它大于0,就减少secret 的大小并返回 true 。否则它返回 false 。这个可以限制对象使用三次。
按照惯例,我们给出一个私有的 self 参数。这个可以令对象对私有方法可见。这种做法是因为ECMAScript Language Specification中的一个错误,这个错误令 this 不能正确地对内部函数设置。
私有方法无法被公共方法调用。要令私有方法有用,我们需要引入一种特权方法。
特权成员
一个特权A privileged 方法可以访问私有的变量和方法,同时它对公共域可见。也可以删除或替换一个特权方法,但不能改变它。
特权方法是用 this 在构造器中分配的。
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var self = this;
this.service = function () {
if (dec()) {
return self.member;
} else {
return null;
}
};
}
service 就是一个特权方法。
前三次调用会返回’abc’。之后 ,它会返回 null。service调用的私有的 dec 方法,而 dec又访问了私有的 secret变量。service对其它的对象和方法是可见的,但不能直接访问私有成员。
闭包
这种公共、私有和特权成员的模式是可行的原因是由于JavaScript有 closure闭包。这个意味着一个内部的函数总是可以访问这个函数外部的变量和参数,甚至在外部的函数返回之后。这是这个语言的一个极其强大的特性。目前没有哪本关于JavaScript编程的书展示了如何发掘这个特性。大多数都没有提到。
私有和特权成员只能在对象构造的时候生成。公共成员可以在任意时刻添加。
模式
公共(Public)
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;私有(Private)
function Constructor(...) {
var self = this;
var membername = value;
function membername(...) {...}
}注意,实际上函数语句
function membername(...) {...}
是以下语句的缩写,两者相同:
var membername = function membername(...) {...};特权(Privileged)
function Constructor(...) {
this.membername = function (...) {...};
}
分享到:
相关推荐
了解并熟练掌握JavaScript中的面向对象和私有变量的概念,能够帮助开发者编写更加安全、模块化的代码,提高软件的可维护性和可扩展性。同时,这也涉及到JavaScript的其他高级特性,如闭包、作用域以及函数作为一等...
JavaScript中的私有属性和静态属性是面向对象编程中重要的概念,它们允许我们限制对某些数据和方法的访问,从而提高代码的安全性和封装性。在JavaScript中,由于其独特的语法特性,我们不能像在其他一些语言(如Java...
JavaScript私有变量是一种重要的编程概念,它涉及到函数作用域、闭包和面向对象设计原则。私有变量在函数内部定义,不能直接从函数外部访问,这有助于保护数据,防止不必要的篡改,确保代码的安全性和封装性。 在...
在ES6之前,JavaScript没有私有属性的语法,但可以通过一些技巧模拟私有性,比如使用函数作用域或者闭包来创建私有变量。示例代码如下: ```javascript function User(name, age) { var name = name; // 私有属性 ...
这样,所有实例共享相同的私有变量和方法: ```javascript (function() { var _name = ""; Person = function(value) { _name = value; }; Person.prototype.getName = function() { return _name; }; ...
Java中的`static`关键字是用来声明静态变量或静态方法的,它是面向对象编程中非常...理解静态变量和方法的使用是成为一名熟练的Java开发者的关键。在编写代码时,明智地使用`static`可以帮助提高程序的效率和可维护性。
在`parent`构造函数中,`pname`变量和`pfun`函数都是通过闭包创建的私有属性和方法,因为它们定义在函数内部,无法通过外部对象实例直接访问。 ```javascript var pname = "private"; var pfun = function() { ...
在JavaScript中,静态成员通常是指那些绑定到类本身而非类的实例上的属性和方法。实际上,JavaScript中并没有严格意义上的静态类,但可以通过函数或对象字面量来模拟实现。静态成员通常通过函数直接访问,而非通过...
在JavaScript中,可以使用构造函数或class关键字的静态成员声明来定义静态属性和方法。 现在,我们通过一个具体的例子来说明如何在JavaScript中使用JSON对象来模拟类定义语法,并实现私有成员、受保护成员和静态...
在JavaScript中,可以通过在构造函数上直接定义属性和方法来创建静态成员。例如,在上述代码中,`name`属性被设置为构造函数`myContructor`的属性,这意味着它是一个静态属性,所有实例共享这个属性。同样,`...
JavaScript 中的类并没有像 Java 或 C# 那样的严格访问修饰符,但可以通过约定俗成的方式来模拟私有属性和方法,例如使用下划线前缀 `_`(如 `_privateVar`)表示非公开成员。 8. **静态方法和属性** 类还可以...
在JavaScript中,静态类通常是指没有实例化,只提供静态方法和属性的类。我们可以通过在类定义外部创建一个对象来实现静态类,这个对象将包含所有的静态方法和属性: ```javascript var StaticClass = { ...
面向对象的JavaScript编程是JavaScript开发中的重要概念,它允许我们以类和对象的方式来组织和处理数据。以下是对标题和描述中涉及的知识点的详细解释: 1. **引用**:在JavaScript中,对象是通过引用传递的,这...
JavaScript设计模式中的封装和信息隐藏是面向对象编程中的核心概念,它们旨在保护数据免受不必要的外部访问和修改,从而提高代码的稳定性和可维护性。虽然JavaScript不是一种典型的面向对象语言,但通过一些技巧和...
在JavaScript中,类和静态类的概念对于理解和编写可维护、模块化的代码至关重要。JavaScript是一种动态类型的语言,不支持像Java或C#那样的传统类结构,但它可以通过模拟来实现类的概念。在JavaScript中,我们可以...
私有属性和方法 模块模式 沙箱模式 静态成员 对象常量 链模式 method()方法 小结 第6章 代码复用模式 传统与现代继承模式的比较 使用类式继承时的预期结果 类式继承模式#1——默认模式 类...