细品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实现的一个简单动画效果

    首先,需要明确什么是动画效果:动画是指将元素从一种状态平滑地转换到另一种状态的过程。在 Web 开发中,我们通常使用动画来提升用户体验,比如当用户鼠标移到一个按钮上时,按钮的背景色逐渐变亮。 原生JavaScript能够自如地控制DOM元素,因此我们可以使用它实现简单的动画效果。具体步骤如下: 设置初始状态和目标状态 首先需要定义元素的初始状态和目标状态。比…

    JavaScript 2023年6月10日
    00
  • js跨浏览器的事件侦听器和事件对象的使用方法

    JS跨浏览器的事件侦听器和事件对象的使用方法 在不同的浏览器中,事件侦听器的实现方式可能会有所不同,为了保证代码的兼容性,我们需要了解跨浏览器的事件侦听器的实现方法。 事件侦听器的绑定 用JavaScript绑定事件处理程序的方法有三种: 在html元素中直接指定,写法如下: html <button onclick=”alert(‘点击了按钮’)”&…

    JavaScript 2023年6月10日
    00
  • JavaScript实现瀑布动画

    下面是详细讲解“JavaScript实现瀑布动画”的完整攻略: 什么是瀑布动画? 瀑布动画又叫瀑布流布局,是指网页图片或内容呈现成瀑布状排布的效果,每一列内部呈垂直方向排列,列与列之间则按照一定的间距排列,整个布局的效果类似于瀑布流。 实现瀑布动画的技术 要实现瀑布动画,需要使用CSS和JavaScript实现。其中,CSS主要用于布局的排版,通过设置每一列…

    JavaScript 2023年6月10日
    00
  • JavaScript将当前时间转换成UTC标准时间的方法

    JavaScript提供了多种方法将本地时间转换为UTC标准时间。本文将为你详细介绍一些最常用和最有效的方法。 方法1:使用Date对象的toUTCString()方法 使用Date对象的toUTCString()方法可以方便地将当前时间转换为UTC标准时间。 let d = new Date(); let utcString = d.toUTCString…

    JavaScript 2023年5月27日
    00
  • JS原生数据双向绑定实现代码

    JS原生数据双向绑定是实现MVVM(Model-View-ViewModel)框架的重要基础,该框架可以将数据和页面进行解耦,提高开发效率和代码可维护性。下面是JS原生数据双向绑定的实现代码攻略: 1. 实现数据绑定 数据绑定是指将数据与页面元素建立关联,当数据发生改变时,页面元素也会自动更新。我们可以使用Object.defineProperty()方法实…

    JavaScript 2023年6月10日
    00
  • JavaScript canvas绘制动态圆环进度条

    现在我来详细讲解如何通过 JavaScript canvas 绘制动态圆环进度条的完整攻略。 概述 原理:利用 <canvas> 标签绘制一个圆环,再通过控制圆环的起始弧度和结束弧度来实现进度条的动态效果。 需要掌握的知识: HTML5 <canvas> 标签的使用 ctx.beginPath()、ctx.closePath()、ct…

    JavaScript 2023年6月11日
    00
  • JavaScript观察者模式(经典)

    JavaScript观察者模式是一种常见的软件设计模式,被广泛应用于JavaScript代码中。其核心思想是,当某个对象(主题对象)发生变化时,能够通知订阅了它的观察者对象,并且观察者对象能够得到主题对象的变化信息并进行相应的处理。 简单来说,观察者模式可以使多个对象之间产生松耦合关系,让代码具备更好的可维护性和可扩展性。 以下是详细的攻略: 观察者模式的基…

    JavaScript 2023年6月10日
    00
  • JS JSOP跨域请求实例详解

    JS JSOP跨域请求实例详解 什么是跨域请求? 跨域请求是指在一个来源(即域名、端口、协议都相同)的网页中,不能发起对另一个来源的网页的请求。这是由浏览器的同源策略所限制的。 当在一个网页中通过 AJAX、Fetch、WebSocket 等方式向另一个域名(或主机名、端口号、协议)发起请求时,由于安全原因,浏览器会拦截这些请求,而这种被拒绝的请求就称为“跨…

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