细品javascript 寻址,闭包,对象模型和相关问题

以下是关于“细品 JavaScript 寻址、闭包、对象模型和相关问题”的详细攻略。

一、JavaScript 寻址

JavaScript 寻址是指在访问对象的属性或方法时,JavaScript 引擎会自动查找对象及其原型链,然后返回相应属性或方法的值或引用。具体实现方式有点类似于链表,会一层层向上查找直到找到目标属性或方法。

例如,我们可以创建一个对象 person

let person = {
  name: 'Tom',
  age: 20,
  sayHi() { console.log(`Hi, my name is ${this.name}.`); }
};

如果我们想要访问 person 对象的 name 属性和 sayHi 方法,可以这样做:

console.log(person.name); // 输出 'Tom'
person.sayHi(); // 输出 'Hi, my name is Tom.'

这里的 person.nameperson.sayHi() 就是通过寻址获取 person 对象的属性和方法。

二、JavaScript 闭包

闭包指的是在函数内部创建另一个函数,并且另一个函数可以访问到外部函数的变量、参数和内部函数,即使外部函数已经执行完毕、退出调用栈,内部函数依然可以使用外部函数的变量、参数和内部函数。闭包可以延长变量的生命周期,并可以使用作用域链来实现一些高级的编程技巧。

例如,我们可以创建一个函数 outerFn,并在其中定义一个内部函数 innerFn

function outerFn() {
  let name = 'Tom';

  function innerFn() {
    console.log(`My name is ${name}.`);
  }

  return innerFn;
}

let inner = outerFn();
inner(); // 输出 'Myname is Tom.'

这里的 inner 是外部函数 outerFn 返回的内部函数 innerFn,而 innerFn 可以访问到 outerFn 中的 name 变量,因为 innerFn 形成了一个闭包,保留了 name 变量的引用。

三、JavaScript 对象模型

JavaScript 对象模型(Object Model)指的是 JavaScript 的对象和其原型链的结构。在 JavaScript 中,所有的对象都是继承自 Object.prototype,而原型链是由 __proto__ 属性连接起来的。当我们访问一个对象的属性或方法时,如果当前对象不存在该属性或方法,则会沿着原型链逐层查找,直到找到或者到达 Object.prototype。

例如,我们可以创建一个构造函数 Person,并在 Person.prototype 上添加一个 sayHi 方法:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function() {
  console.log(`Hi, my name is ${this.name}, I'm ${this.age} years old.`);
}

let person = new Person('Tom', 20);
person.sayHi(); // 输出 'Hi, my name is Tom, I'm 20 years old.'

这里的 person 对象继承了 Person.prototype 上的 sayHi 方法,而 Person.prototype 又继承了 Object.prototype 的方法。因此,person.sayHi() 在访问时会沿着原型链逐层查找,最终找到了 Person.prototype 上的 sayHi 方法。

示例一:使用 Object.defineProperty() 创建只读属性

在 JavaScript 中,我们可以使用 Object.defineProperty() 方法来创建只读属性。具体实现方式是使用 get 方法获取属性值,但没有 set 方法设置属性值,这样就实现了只读属性。

例如,我们可以创建一个对象 person,并在其上创建一个只读属性 age

let person = {
  name: 'Tom'
};

Object.defineProperty(person, 'age', {
  get() { return 20; },
  enumerable: true,
  configurable: false
});

console.log(person.name); // 输出 'Tom'
console.log(person.age); // 输出 20

person.age = 25; // 不能修改只读属性

console.log(person.age); // 输出 20

这里的 Object.defineProperty() 创建了一个描述符对象,其中包括 get 方法获取属性值为 20,而 enumerable 属性为 true,表示能够被枚举,而 configurable 属性为 false,表示不能删除或修改该属性,实现了只读属性。

示例二:使用 IIFE 创建私有变量

在 JavaScript 中,我们可以使用 IIFE(Immediately Invoked Function Expression)来创建私有变量,即对外部不可访问的变量。

例如,我们可以创建一个模块 counter,并在其内部使用 IIFE 创建一个私有变量 count,其外部无法访问:

let counter = (function() {
  let count = 0;

  return {
    increment() { count++; },
    decrement() { count--; },
    getCount() { return count; }
  };
})();

counter.increment();
counter.increment();
counter.decrement();

console.log(counter.getCount()); // 输出 1

这里的 counter 模块内部使用了 IIFE 创建了一个私有变量 count,而通过返回一个包含闭包内的三个方法的对象,对外暴露了对 count 的操作方法,实现了对私有变量的保护。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:细品javascript 寻址,闭包,对象模型和相关问题 - Python技术站

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

相关文章

  • JavaScript Split()方法

    JavaScript的split()方法用于将字符串分割成字符串数组,返回数组。它可以按照指定的分割符来分割字符串。以下是详细讲解split()方法的攻略: 语法 string.split(separator, limit) 参数:- separator(必须):用于指定分割符的字符串或正则表达式。- limit(可选):一个整数,限定分割后的数组长度。 基…

    JavaScript 2023年5月18日
    00
  • javascript FormatNumber函数实现方法

    下面是关于 JavaScript 实现 FormatNumber 函数的攻略。 1. 什么是 FormatNumber 函数? FormatNumber 函数可以将数字格式化为带有千位分隔符(千分位)的字符串形式,方便数据的可视化和阅读。例如将数字 10000 格式化为 10,000。 2. 实现 FormatNumber 函数的方法 要实现 FormatN…

    JavaScript 2023年5月27日
    00
  • javascript代码简写的几种常用方式汇总

    JavaScript代码简写的几种常用方式汇总 本文将介绍 JavaScript 代码简写的几种常用方式,并提供示例说明。 1. 箭头函数 箭头函数是 ES6 中的新特性,可以将函数的定义简写为一个箭头符号(=>)后面跟着表达式的形式,可以很方便地编写简短的函数。 示例: // 传统写法 function add(a, b) { return a + …

    JavaScript 2023年5月18日
    00
  • 如何用javascript控制上传文件的大小

    当我们需要上传文件时,通常需要限制文件大小以确保上传的文件尺寸在合理范围内。在javascript中,我们可以使用以下方法来控制上传文件的大小。 1. 使用input元素限制文件大小 在HTML中,我们可以使用input元素来处理文件上传。如果我们将input元素的type属性设置为file类型,则该元素将允许用户选择本地计算机上的文件,并在提交提交表单时将…

    JavaScript 2023年5月27日
    00
  • JavaScript 脚本将当地时间转换成其它时区

    当地时间转换成其它时区,可以通过 JavaScript 的 Date 对象来实现。以下是完整攻略: 步骤一:获取当前时间 首先,我们可以通过 JavaScript 的 Date 对象获取当前时间。可以使用以下代码: const now = new Date(); 这样,我们就可以得到 now 变量,它是当前时间的 Date 对象。 步骤二:获取时差 我们需要…

    JavaScript 2023年5月27日
    00
  • js获取url参数值的两种方式

    下面是使用 JavaScript 获取 URL 参数的两种方式的详细攻略。 方式一:使用正则表达式 使用正则表达式是一种比较常用的方式,它可以从 URL 中提取出我们需要的参数。这种方法核心就是通过正则表达式匹配 URL 字符串中的参数值。 function getQueryString(key) { const reg = new RegExp(‘(^|&…

    JavaScript 2023年6月11日
    00
  • javascript 设计模式之单体模式 面向对象学习基础

    JavaScript 设计模式之单体模式 什么是单体模式? 单体模式,也叫单例模式,是一种面向对象设计模式,它保证一个类只能有一个实例,并提供一个访问它的全局访问点。 单体模式的优点 提供了对唯一实例的受控访问。 在一个应用程序中,这样的实例很少,因为这会节约系统资源。 可以用于全局变量,避免命名空间污染。 提供了对单例对象的集中化管理。 实现单体模式 在 …

    JavaScript 2023年5月27日
    00
  • JavaScript实现的in_array函数

    下面是关于“JavaScript实现的in_array函数”的完整攻略。 1. 了解in_array函数的作用 ‘in_array’函数可以判断一个元素是否在一个数组中。如果在,返回true,否则返回false。 2. 实现in_array函数 JavaScript中没有内置的in_array函数,但是可以使用一些简单的方法实现。 2.1 方法一:使用ind…

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