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

yizhihongxing

以下是关于“细品 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日

相关文章

  • JS实现的适合做faq或menu滑动效果示例

    JS实现FAQ和Menu滑动效果可以使用jQuery的库来实现,下面是详细的攻略: 创建HTML文件并引入jQuery库 若已有HTML文件则可以跳过此步骤。若无则需要创建一个HTML文件并在标签中引入jQuery库。可以使用以下代码: <!DOCTYPE html> <html> <head> <title>…

    JavaScript 2023年6月10日
    00
  • javaScript遍历对象和数组的方法总结

    JavaScript遍历对象和数组的方法总结 在JavaScript中,遍历对象和数组是非常重要的操作。对象和数组中都有各种各样的数据,我们需要用不同的方式去遍历它们并对其进行处理。本文将详细介绍JavaScript中遍历对象和数组的方法。 遍历对象的方法 在JavaScript中,一般使用for…in循环来遍历对象。for…in循环会遍历对象的所有…

    JavaScript 2023年5月27日
    00
  • 利用javascript判断文件是否存在

    利用JavaScript判断文件是否存在的攻略包含以下几个步骤: 1.构造XMLHttpRequest对象;2.指定文件地址,使用HEAD方法进行异步请求;3.根据请求结果判断文件是否存在。 在具体实现时,可以按照以下步骤进行: 第一步:构造XMLHttpRequest对象 var xhr = new XMLHttpRequest(); 第二步:指定文件地址…

    JavaScript 2023年5月27日
    00
  • JS实现动态倒计时功能(天数、时、分、秒)

    实现动态倒计时功能是Web开发中常见的需求之一,JS是实现这一功能的重要工具之一。下面我会为你详细讲解如何使用JS实现动态倒计时,并提供两个详细的示例说明。 编写HTML结构 首先需要在HTML页面中添加需要倒计时的元素,可以使用HTML5中的<time>元素来显示时间。在这个例子中,我们将需要倒计时的元素放在<div>标签中。 &l…

    JavaScript 2023年5月27日
    00
  • javascript判断两个IP地址是否在同一个网段的实现思路

    实现IP地址判断是否在同一个网段,可以使用Javascript实现的思路如下: 首先将IP地址转换成二进制格式,方便进行比较,然后将子网掩码也转换成二进制格式。 对转换后的IP地址和子网掩码进行&(与运算),得到的结果就是该IP地址所在的网络地址。 将要比较的两个IP地址按照以上步骤进行转换得到两个网络地址。 比较两个网络地址是否相同,如果相同,则说…

    JavaScript 2023年6月11日
    00
  • JavaScript中document.referrer的用法详解

    JavaScript中document.referrer的用法详解 在JavaScript中,document.referrer是一个非常有用的属性,它可以获取当前页面的来源(即上一个页面的URL)。在本篇攻略中,我们将详细讲解document.referrer的用法和应用场景。 1. 使用document.referrer获取上一个页面的URL docum…

    JavaScript 2023年6月11日
    00
  • 新浪微博COOKIES盗取[flash编程安全+apache http-only cookie 泄漏利用]

    首先,需要了解COOKIES的作用,简单来说,COOKIES是一个保存在浏览器上的文本文件,它可以记录用户访问过的页面和提供给网站的个人信息等,以方便下次用户访问时快速获得所需的内容。然而,COOKIES也有它的弊端,比如可能被黑客盗取,从而获取用户的个人信息。 在此,我们就讲解一下新浪微博COOKIES盗取的攻略步骤: 确定攻击目标 首先,需要确定攻击的目…

    JavaScript 2023年6月11日
    00
  • javascript的数组和常用函数详解

    下面我将为大家详细讲解“JavaScript的数组和常用函数”: JavaScript数组基础知识 JavaScript数组是一种可以存储多个值的变量类型,可以存储数字、字符串、布尔值等等各种类型的值。数组是由一个方括号围成的有序列表,在方括号中每个元素之间用逗号分隔。 例如,下面是一个由数字组成的数组: let myArray = [1, 2, 3, 4,…

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