JavaScript的public、private和privileged模式

yizhihongxing

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技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS函数式编程之纯函数、柯里化以及组合函数

    函数式编程是一种以函数为中心的编程范式。在JavaScript中,函数式编程被越来越广泛地使用。本文将介绍函数式编程中的三个重要概念:纯函数、柯里化和组合函数。 纯函数 纯函数是指满足以下条件的函数: 给定相同的输入,总是返回相同的输出。 不产生副作用,即不会影响到函数外部的状态,如修改全局变量或参数。 纯函数的优点在于: 可以简化代码的测试和调试,因为纯函…

    JavaScript 2023年5月27日
    00
  • jsp+ajax发送GET请求的方法

    当需要在JSP页面中使用ajax发送GET请求时,可以参照以下步骤进行操作: 步骤一:引入jQuery库文件 使用ajax发送请求时需要引入jQuery库文件。可以在head标签中使用以下代码引入: <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js&quot…

    JavaScript 2023年6月11日
    00
  • 微信小程序开发实战教程之手势解锁

    微信小程序开发实战教程之手势解锁攻略 背景介绍 在微信小程序开发中,手势解锁是一个非常实用的功能,例如在支付页面上,用户需要输入手势密码才能完成支付等操作。本攻略将介绍如何实现手势解锁的功能及其相关实现步骤。 实现步骤 手势解锁的实现步骤如下: 绘制手势密码锁屏界面,可使用canvas标签绘制,使用wx.createCanvasContext方法获取canv…

    JavaScript 2023年6月11日
    00
  • asp.net(C#)中给控件添加客户端js事件的方法

    给控件添加客户端js事件是asp.net(C#)开发中的常见需求,我们可以通过以下步骤完成: 第一步:在aspx页面中引入js文件 在aspx页面中需要引入相应的js文件,例如: <script type="text/javascript" src="~/scripts/jquery-3.6.0.min.js"&…

    JavaScript 2023年6月11日
    00
  • Flutter web bridge 通信总结分析详解

    Flutter web bridge 通信总结分析详解 本文将详细讲解Flutter Web中的Bridge通信机制。Flutter Web框架中,开发者可以使用Bridge来实现Flutter与Web端的通信交互。Bridge通信机制主要包含以下三个部分:Method Channel、Event Channel、Basic Message Channel。…

    JavaScript 2023年6月11日
    00
  • Vue实现浏览器端扫码功能

    下面是Vue实现浏览器端扫码功能的完整攻略: 1. 使用第三方库实现扫码 使用第三方库是最简单的实现方式之一。可以使用ZXing-js库,它提供了 JavaScript 代码中解码和编码二维码和条形码的功能。 步骤 安装ZXing-js: bash npm install @zxing/library 在 Vue 应用中引入 ZXing-js: javasc…

    JavaScript 2023年6月11日
    00
  • js中实例与对象的区别讲解

    JS中,实例和对象都是面向对象编程的概念,但它们有着不同的含义。 实例与对象的区别 对象 对象是JS中非常重要且常见的数据类型。它可以是一个简单的数据类型,也可以是一个数组,函数等组合类型,甚至可以是由其他对象组成的复杂类型。每个对象都有一个自己的属性和方法,这些方法和属性可以被对象访问和修改。以下是一个简单对象的例子: let person = { nam…

    JavaScript 2023年5月27日
    00
  • Android实现网络多线程文件下载

    实现网络多线程文件下载在Android开发中非常常见,下面我会详细讲解这个过程的完整攻略。 1. 实现方式 Android实现网络多线程文件下载的方式是通过Java中的多线程实现的,其中主要使用到了Java IO和Java多线程的知识。可分为以下几个步骤: 创建HttpURLConnection对象,连接要下载的文件URL地址; 获取要下载的文件的总大小; …

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部