JavaScript是基于对象的编程语言,因此在讨论其公共、私有和特权模式时,通常是在对象和类的上下文中。
公共模式(Public Mode)
在JavaScript中,公共模式是指公共成员是可以通过对象外部进行访问的成员。例如,我们可以创建一个简单的Person类:
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
}
}
在这个例子中,“name”和“age”属性以及“sayHello”方法都是公共的,因为它们可以从类的外部访问。当我们创建一个Person对象时,我们可以访问这些成员:
var person = new Person("John", 30);
console.log(person.name); //John
console.log(person.age); //30
person.sayHello(); //Hello, my name is John and I am 30 years old.
私有模式(Private Mode)
在JavaScript中,私有模式是指只有在类内部才可以访问的成员。通常,我们使用闭包来实现私有成员。例如:
function Person(name, age) {
var privateVar = "This is a private variable";
var privateMethod = function() {
console.log("This is a private method");
}
this.name = name;
this.age = age;
this.sayHello = function() {
console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
//可以在类内部访问私有成员
console.log(privateVar);
privateMethod();
}
}
在这个例子中,“privateVar”和“privateMethod”都是私有的,因为它们只能在类内部访问。当我们创建一个Person对象时,我们无法直接访问这些成员:
var person = new Person("John", 30);
console.log(person.privateVar); //undefined
person.privateMethod(); //TypeError: person.privateMethod is not a function
特权模式(Privileged Mode)
在JavaScript中,特权模式是指只有在类内部和子类内部才可以访问的成员。通常,我们使用特权方法来实现特权成员。例如:
function Person(name, age) {
var privateVar = "This is a private variable";
var privateMethod = function() {
console.log("This is a private method");
}
this.name = name;
this.age = age;
//特权方法
this.getPrivateVar = function() {
return privateVar;
}
this.setPrivateVar = function(value) {
privateVar = value;
}
this.sayHello = function() {
console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
//可以在类内部访问私有成员
console.log(privateVar);
privateMethod();
}
}
在这个例子中,“getPrivateVar”和“setPrivateVar”都是特权的,因为它们只能在类内部和子类内部访问。当我们创建一个Person对象时,我们可以访问这些成员:
var person = new Person("John", 30);
//使用特权方法
console.log(person.getPrivateVar()); //This is a private variable
person.setPrivateVar("New private value");
console.log(person.getPrivateVar()); //New private value
示例说明
示例1:实现JavaScript对象的私有属性
在下面的示例中,我们将实现一个人类(Person)的私有属性,用于存储人的偏好颜色。只有在Person类内部才可以访问这个私有属性,在类的外部是无法访问的。我们使用闭包将偏好颜色存储在私有变量中。
function Person(name, age) {
var preferences = {
color: "blue"
};
this.name = name;
this.age = age;
//特权方法
this.getColorPreference = function() {
return preferences.color;
}
this.setColorPreference = function(color) {
preferences.color = color;
}
this.sayHello = function() {
console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
}
}
在这里,我们将偏好颜色存储在名为“preferences”的私有变量中。我们使用特权方法“getColorPreference”和“setColorPreference”来获取或设置偏好颜色。在“sayHello”方法中,我们演示了如何使用公共方法访问这些成员。在Person类的外部,我们无法直接访问preferences属性:
var person = new Person("John", 30);
console.log(person.getColorPreference()); //blue
person.setColorPreference("red");
console.log(person.getColorPreference()); //red
console.log(person.preferences); //undefined - 无法直接访问preferences
示例2:使用prototype定义公共方法
在JavaScript中定义公共方法有两种不同的方法:在类构造函数中定义方法,或使用prototype属性在类定义之后定义方法。第一种方法可以使方法访问类的私有成员,但也会在每次创建对象时重新定义方法,因此使用prototype的方法更加高效。下面的示例演示了如何使用prototype属性定义公共方法:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
}
在这个例子中,我们使用prototype属性“sayHello”方法。无论创建多少次Person对象,这个方法只会在内存中定义一次,因此它更加高效。我们使用“this”关键字来访问公共属性“name”和“age”。
var person1 = new Person("John", 30);
var person2 = new Person("Mary", 25);
person1.sayHello(); //Hello, my name is John and I am 30 years old.
person2.sayHello(); //Hello, my name is Mary and I am 25 years old.
通过使用prototype属性创建公共方法,我们可以使代码更加简洁和高效,并且不需要多次定义相同的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript的public、private和privileged模式 - Python技术站