十、原型、原型链、闭包和立即执行函数、插件开发初始

news2024/12/24 3:21:37

十、原型、原型链、闭包和立即执行函数、插件开发初始

原型

什么是原型(prototype)?

无论何时,只要创建一个函数,就会按照特定的规则为这个函数创建一个prototype属性,指向原型对象。

function Car(){};
console.log(Car.prototype);

在这里插入图片描述


布白理解:

prototype属性的属性值是对象的形式,所以我们说是prototype指向原型对象。

类似于,构造函数的this属性的属性值是对象的形式,而构造函数会默认返回this,所以我们说构造函数会创建一个对象,this指向这个对象。

属性值是对象,我们就说这个属性指向这个对象。


为什么要引入原型?= 原型的作用

简单来说:解决代码冗余问题->

减少构造函数中,对被构造出的不同对象,相同属性的多次配置的冗余问题。

:

prototype是定义的构造函数构造出的每个对象的公共祖先。

所有被构造函数构造出的对象都可以继承原型上的属性和方法。

function HandPhone(color, brand){
    this.color = color;
    this.brand = brand;
}
HandPhone.prototype.screen = '18.9';
HandPhone.prototype.chose = function (obj) {
    console.log(obj.color, obj.brand);
}

var hp1 = new HandPhone('red', '小米');
var hp2 = new HandPhone('white', '华为');

console.log(hp1,hp2);
console.log(hp1.screen, hp2.screen);
hp1.chose(hp1);
hp1.chose(hp2);

在这里插入图片描述

补充:构造函数构造出的对象优先访问this上的属性,没有的话再去prototype上去寻找。

实际开发中

我们会把对象的属性写到构造函数内部 -> 配置不同的属性值 (传的参数写到构造函数内部)

把不同对象的公共属性和方法写到prototype上 (写死的值挂到原型)

实例化对象对prototype的增删改查

查:√

function Car(){
    this.name = 'benz';
}
Car.prototype.name = 'prototype';
Car.prototype.num = '1';
var car = new Car();
console.log(car.name, car.num);
console.log(Car.prototype, car);

在这里插入图片描述

实例化对象只能访问prototype,不能对其增、删、改。

补充:实际开发中,我们不会一条条给prototype添加属性,而是直接写成对象的形式,一次添加多条属性。

Car.prototype = {
    name: 'prototype',
    num: '1',
    call: function(){
        console.log('I am calling somebody');
    }
}

原型链

前导知识:

函数中有一个原型属性,原型中有一个constructor属性:

function Car(){}
console.log(Car.prototype);

在这里插入图片描述

函数的原型对象的constructor属性,属性值是构造函数(constructor属性指向函数本身)。

function Car(){}
console.log(Car.prototype.constructor === Car); //ture

注意:这个constructor可以被手动更改指向吗?√


__ proto__属于实例化对象

打印一下实例化对象:

function Car(){}
Car.prototype.name = 'Benz';
Car.prototype.num = '1';
var car = new Car();
console.log(car);
console.log(car.__proto__ === Car.prototype); //true

在这里插入图片描述

__ proto__属于实例化对象

​ 每次调用构造函数创建一个新实例,这个实例内部[[Prototype]]指针就会被赋值为构造函数的原型对象。脚本中没有访问这个[[Prototype]]特性的标准方式,但Firefox、Safari和Chrome会在每个对象上暴露__proto__属性,通过这个属性可以访问原型。

访问对象属性的顺序

​ 访问对象的属性时,先去this上寻找属性,若没有,去this的__proto__上寻找, __proto__指向构造函数的原型对象,即去构造函数的原型对象上寻找。

__proto__中只能指向构造函数的原型吗?可以更改指向吗?√

实例化对象后,重写prototype,对象的属性值是重写前还是重写后?

function Car(){
}
Car.prototype.name = 'Mazda'
var car = new Car();
console.log(Car.prototype);
// {name: 'Mazda', constructor: ƒ}

Car.prototype = {
    name: 'benz'
}
console.log(Car.prototype);
//{name: 'benz'}

console.log(car.name); // 'Mazda'

​ 实例化对象后,重写prototype,通过__proto__访问对象的属性,仍然为重写前原型的属性。

原因:

​ 构造函数实例化对象时,对象才有了__proto__属性,指向此时构造函数的原型对象;这时即使重写原型对象(prototype指向了别的对象),也只是构造函数的原型对象改变了,而不是实例化对象的__proto__指向改变。

function Car(){
}
Car.prototype.name = 'Mazda'
Car.prototype = {
    name: 'benz'
}
var car = new Car();
console.log(car.name); // 'benz'

__proto__永远指向实例化对象后此时的原型对象。

什么是原型链?

原型链有什么用?

尚未讲完

闭包和立即执行函数

写一个闭包:

function test() {
    var a = 1;
    function plus() {
        a++;
        console.log(a);
    }
    return plus;
}

var plus = test();
plus(); //2
plus(); //3
plus(); //4

内部函数被返回到函数外部,相当于把这个函数放到了全局。

window与return的关系

它们有啥区别?-> 写法区别,效果(功能)一样

function adc(){
    window.a = 1;
}
adc();
console.log(a); // 1

上面代码利用window把一个变量放到全局。

那我们能不能用window实现上面的闭包:√

function test() {
    var a = 1;
    function plus() {
        a++;
        console.log(a);
    }
    window.plus = plus;
}
test();
plus(); // 2
plus(); // 3
plus(); // 4

立即执行+闭包

var plus = (function(){
    var a = 1;
    function plus() {
        a++;
        console.log(a);
    }
    return plus;
})();
plus(); // 2
plus(); // 3
plus(); // 4

立即执行+window

(function(){
    var a = 1;
    function plus() {
        a++;
        console.log(a);
    }
     window.plus = plus;
})();
plus(); // 2
plus(); // 3
plus(); // 4

区别:

  • return:必须把返回的函数赋值给全局变量,全局变量再去执行
  • window:在函数内部设置好全局变量,在全局直接执行,不需要全局再用一个变量接收。

插件就是用window的这种写法,window+闭包

插件开发初识:立即执行函数 + 构造函数相关(prototype) + window抛出构造函数

(function(){
    var a = 1;
    function Test(){ //构造函数
        console.log(1);
    }
    Test.prototype = {
        
    }
    window.Test = Test;
})();
var test = new Test();


console.log(Test);
var Test = function(){
    console.log(2);
}
console.log(Test);
console.log(a); //报错

在这里插入图片描述

为什么我们要这么写???

或者问:为什么要使用立即执行函数+window来写插件

  • 隔离全局作用域:ES5没有块级作用域,立即执行函数可以隔离全局作用域:在立即执行函数中声明的变量对于全局来说是不可见的。
  • 把函数放到全局:最后一句:window.Test = Test是为了把写好的函数放到全局,也就是说函数Test在全局中可见也可以被重写。

插件写法:立即执行函数 + 构造函数相关 + window抛出构造函数

补充

立即执行函数写法:

  • 第一种:分号在最后

    (function(){})();
    (function(){})();
    
  • 第二种:分号在最前

    ;(function(){})()
    ;(function(){})()
    

运算符 + 函数 -> 表达式

只有表达式才可以立即执行

(function(){
    console.log(1);
})(); //控制台打印1

+function(){
    console.log(1);
}(); //控制台打印1

!function(){
    console.log(1);
}(); //控制台打印1

false || function(){
    console.log(1);
}(); //控制台打印1

true || function(){
    console.log(1);
}(); //不执行表达式,因为或运算符有真 直接结束运算

作业:

写一个插件,任意传两个数字,调用插件内部方法可以进行加减乘除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue入门与指令

Vue入门 1.1、MVVM编程思想 MVVM:页面输入改变数据,数据改变影响页面数据展示与渲染。 M(model):普通的javascript数据对象。 V(view):前端展示页面。 VM(ViewModel&…

Jmeter初了解-接口并发测试

Jmeter初了解-接口并发测试 介绍 我们在开发的时候,经常会需要进行接口压力测试,确定接口运行的稳定情况 这里我们就使用java开发的测试工具Jmeter来进行测试。 Jmeter 官网地址 Apache JMeter™应用程序是开源软件,是一个 100% 纯 Jav…

Pytorch安装详细过程及遇到的问题解决

一、Aanconda的安装 可以参考笔者的这篇博客:Anaconda安装详细教程 二、准备工作 1、查看本机的python的版本(本机python解释器版本为3.8.5) 2、单击启动Anaconda Prompt创建新虚拟环境 3、在Anaconda Prompt依次执行以下命令,创建名字为pytorch的虚拟…

nn.Embedding使用

nn.Embedding是一种词嵌入的方式,跟one-hot相似但又不同,会生成低维稠密向量,但是初始是随机化的,需要根据模型训练时进行调节,若使用预训练词向量模型会比较好。 1. one-hot one-hot是给定每个单词一个索引&#xf…

概论_第4章__方差D(X)的定义和性质

一 定义 通常以此公式来计算: 就是说: 方差 X的平方再求期望 —— X的期望的平方 即 括号里面的平方的期望减去期望的平方, 怎样求期望点击:概论_第4章__期望的定义和性质 注意: 方差不可能为负数。 2. …

如何快速拥有自己的虚拟形象?

元宇宙(Metaverse),是人类运用数字技术构建的,由现实世界映射或超越现实世界,可与现实世界交互的虚拟世界,具备新型社会体系的数字生活空间。 可见元宇宙第一步是创建专属虚拟形象,但创建3D虚拟…

Android入门第45天-手工发送一个BroadCast

简介 上一篇我们讲了简单的动态BroadCast,今天我们通过手工来发送一条BroadCast进一步来了解BroadCast。 在上一篇里我们使用BroadCast监听网络状态,今天我们要完成的是自己发一条自自己的消息来触发BroadCast Receiver。 设计 为了让Receiver收听到…

蓝牙耳机无延迟哪款好?适合打游戏的无线蓝牙耳机

手机可以说是人手必备,随声得还有蓝牙耳机,随着3.5耳机孔得消失,蓝牙耳机可以说是现在得主流,无论哪个年龄段都可以佩戴蓝牙耳机,日常听歌、追剧,和朋友玩游戏佩戴蓝牙耳机,已经成为一种生活方式…

mybatis06:MyBatis的多表操作

目录 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 ​5.知识小结 1.一对一关系 2.一对多查询 3.多对多查询 4例题演示 前置准备 对应的依赖 <dependencies><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId&…

外汇交易:流行图表指标盘点

您所学到的关于交易的一切都像一种工具&#xff0c;已被添加到外汇交易者的工具箱中。当您在正确的时间使用正确的工具时&#xff0c;您的图表指标工具将为您提供更好的机会做出正确的交易决策。 布林带 布林带用来衡量市场的波动性。它们的作用类似于迷你支撑位和阻力位。 布…

MES系统为何与工厂数字化转型联系紧密

随着数字化技术的发展&#xff0c;MES系统的定义也是在不断的变化。但是&#xff0c;计划调度、质量管理、生产执行以及数据采集&#xff0c;一直都是MES的核心功能。 工厂数字化改造&#xff0c;对于制造业来说并不是一场革命。很多工厂在十年前就实现了车间设备的联网&#…

EXCEL基础:数据有效性设置与从身份证号码提取出生日期、性别操作

如下所示&#xff0c;为某公司的人员信息表&#xff0c;以下操作均是基于该表格&#xff0c;声明&#xff1a;该表格来自网络&#xff01; 下面进行【数据有效性】的设置&#xff1a; 先选中区域&#xff0c;弹出【数据有效性】对话框&#xff0c;在【设置】里的【允许】里输入…

win11设置java环境变量

python环境变量比java简单很多&#xff0c;而java比较麻烦&#xff0c;下面这些步骤应该是一步不能少&#xff0c;必须新建两个而且移动到最上面 一、找到设置环境变量 只要是windows系统&#xff0c;他就长这样&#xff0c;需要找到这个页面 很多之前的文章都会说&#xff1…

[附源码]Node.js计算机毕业设计电影院订票系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

六、作用域,作用域链,预编译,闭包基础

六、作用域&#xff0c;作用域链&#xff0c;预编译&#xff0c;闭包基础 使用AO,GO说明作用域和作用域链 AO与函数有关&#xff0c;函数能创造出独立的空间&#xff0c;但是这句话不太对&#xff0c;接下来就是解释&#xff1a; 对象 每个对象都有属性和方法&#xff1a; …

MobileNetV2原理说明及实践落地

本文参考&#xff1a; 轻量级网络——MobileNetV2_Clichong的博客-CSDN博客_mobilenetv2 1、MobileNetV2介绍 MobileNetV1主要是提出了可分离卷积的概念&#xff0c;大大减少了模型的参数个数&#xff0c;从而缩小了计算量。但是在CenterNet算法中作为BackBone效果并不佳&…

【MATLAB教程案例59】使用matlab实现基于LSTM网络的数据分类预测功能与仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.LSTM网络理论概述

荧光点击试剂ICG-N3, ICG-azide,根据具体的需求进行定制, 避免频繁的溶解和冻干,取用时注意干燥

【英文名称】 ICG-azide&#xff0c;ICG-N3 【结 构 式】 【CAS】N/A 【分子式】C48H56N6O4S 【分子量】813.07 【基团】叠氮基基团 【纯度】95% 【规格】1mg&#xff0c;5mg&#xff0c;10mg 【是否接受定制】根据具体的需求进行定制 【外观】 绿色固体&#xff08;具…

最小二乘问题,,而不是方法

最小二乘是一大类问题&#xff0c;而不是一个简单的方法 适用于&#xff1a;线性&#xff08;非线性&#xff09;方程组问题&#xff0c;如果观测带有噪声&#xff0c;我们需要建立最小二乘模型。如果噪声符合高斯分布&#xff0c;即最小二乘问题的解对应于原问题的最大似然解…

千万不要做“舔狗式”营销

不知道在网上做生意的你们是否经常陷入我下面说的这几种尴尬境地&#xff1a;每天都在推广引流&#xff0c;每天都在发广告&#xff0c;但转化率却低得可怜。粉丝质量普遍不行&#xff0c;不精准&#xff0c;好不容易来几个粉&#xff0c;不是白嫖党就是垃圾粉。两句话不对头&a…