JS高级-构造函数与原型

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南) 本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。 阅读详情

JS高级-构造函数与原型

1.实例、静态成员以及构造函数

1.1实例成员
  • 实例成员就是通过构造函数内部的this添加的成员
  • 实例成员只能通过实例化的对象来访问,不可以通过构造函数来访问实例成员
function Fun(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.test=function(){
        console.log('实例成员')
    }
}
var fun=new Fun('小阿涵',22,'男');
fun.test();
console.log(fun.name);
console.log(fun.test);

在这里插入图片描述

1.2静态成员
  • 静态成员是指在构造函数本身上添加的成员
  • 静态成员只能通过构造函数来访问,不能通过对象来访问
function Fun(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.test=function(){
        console.log('实例成员')
    }
}
var fun=new Fun('小阿涵',22,'男');
fun.test();
console.log(fun.name);
Fun.school='ZZGS';
console.log(Fun.school);

在这里插入图片描述

1.3构造函数的问题

构造函数虽然好用,但是存在内存浪费的问题

function Star(name,age){
    this.name=name;
    this.age=age;
    this.sing=function(){
        console.log('111')
    }
}
var ldh=new Star('GG',18)
var zxy=new Star('JJ',19)
  • 上述代码中,sing()方法是一个函数,函数属于复杂数据类型,在我们的内存中,无论是ldh对象中还是zxy对象,该方法都会单独开辟出一个新的空间来存放该函数,因此便产生了内存浪费的问题
  • 我们可以通过prototype属性来改善上述问题
    在这里插入图片描述

2.原型

什么是原型?

原型是一个对象,我们也称为prototype为原型对象

原型的作用是什么?

共享方法,节约内存资源

2.1构造函数原型 prototype
  • 构造函数可以通过原型分配的函数是所有对象所共享的
  • 我们所创建的每一个函数,解析器都会向函数中添加一个prototype
  • 这个属性对应着一个对象,这个对象就是所谓的原型对象
  • 该对象的所有属性和方法,都会被构造函数所拥有
  • 如果函数作为普通函数调用prototype没有任何作用
  • 我们可以把那些不变的方法,直接定义到prototype对象上,这样所有对象的实例就可以共享这些方法
2.2给原型对象添加属性(一般都是方法)

一般情况下,我们的公共属性定义到构造函数里面,公共的方法我们放到原型对象上

function Star(name,age){
    this.name=name;
    this.age=age;
}
Star.prototype.sing=function(){
    console.log('原型方法')
}
var ldh=new Star('GG',18)
var zxy=new Star('JJ',19)
ldh.sing();

在这里插入图片描述

2.3对象原型__proto__

对象都会有一个__proto__指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在

function Star(name,age){
    this.name=name;
    this.age=age;
}
Star.prototype.sing=function(){
    console.log('原型方法')
}
var ldh=new Star('GG',18)
var zxy=new Star('JJ',19)
conslog.log(ldh);//对象身上系统自己添加一个 __proto__ 指向我们构造函数的原型对象

在这里插入图片描述

  • __proto__和prototype两个属性是等价的
  • __proto__对象原型的意义就在于为对象的查找机制提供了一个方向,或者说一条路线,但是他是一个非标准属性
    在这里插入图片描述
2.4 construct 构造函数

对象原型(proto)和构造函数(prototype)原型对象里面都有一个属性 constructor 我们称为构造函数,因为他指回构造函数本身

function Star(name,age){
    this.name=name;
    this.age=age;
}
Star.prototype.sing=function(){
    console.log('原型方法')
}
var ldh=new Star('GG',18)
var zxy=new Star('JJ',19)
conslog.log(ldh);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoKHQvYX-1652169794046)(img/11.png)]

2.5构造函数、实例、原型对象三者之间的关系

在这里插入图片描述

3.显示原型与隐式原型

(1)每个函数都有function都有一个prototype,即显示原型

function fun(){

}
console.log(fun.prototype);

在这里插入图片描述

(2)每个实例对象都有一个__proto__,可称为隐式原型

function Fun(){

}
console.log(Fun.prototype);
var fun=new Fun();
console.log(fun.__proto__)

在这里插入图片描述

(3)对象的隐式原型的值为其对应构造函数的显式原型的值

function Fun(){

}
console.log(Fun.prototype);
var fun=new Fun();
console.log(fun.__proto__)
console.log(Fun.prototype===fun.__proto__);//true

(4)总结:

  • 函数的prototype属性:在定义函数时自动添加的,默认值是一个Object空对象
  • 对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
  • 我们可以直接操作显式原型,无法直接操作隐式原型(ES6之前)
  • prototype属性 与 __proto__属性 两者都为引用类型

4.原型链

  • 只要是对象就有__proto__原型,指向我们的原型对象
function Star(name,age){
    this.name=name;
    this.age=age;
}
Star.prototype.sing=function(){
    console.log('我是Star原型对象的方法')
}
var ldh=new Star('ZZ',22);
console.log(Star.prototype);
console.log(Star.prototype.__proto===Object.prototype);
//Object.prototype原型对象里面的__proto__指向空
console.log(Object.prototype.__proto__);

在这里插入图片描述

因此我们的每一个对象实例都有一个__proto__原型,这个原型指向我们的原型对象prototype,这个原型对象里面也有一个__proto__,这个原型指向我们的Object的原型对象,Object原型对象里面的也有__proto__,但是这个__proto__指向空,这样的指向方向就构成了我们的原型链
在这里插入图片描述

5.JavaScript的成员查找机制(规则)

JavaScript的成员查找机制将遵循原型链的指向进行查找,一层一层逐步查找,同时遵循就近原则

  • (1)当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有这个属性
  • (2)如果没有就差找他的原型(也就是__proto__指向的prototype原型对象)
  • (3)如果还没有就查找原型对象的原型(Object的原型对象)
  • (4)依次类推一直找到Object为止(null)

6.原型对象的this指向问题

  • (1)在构造函数里,里面的this指向的是我们的对象实例
  • (2)原型对象函数里面的this指向的是 实例对象
function Star(name,age){
    this.name=name;
    this.age=age;
}
var that;
Star.prototype.sing=function(){
    console.log('我是Star原型对象的方法');
    that=this;
}
var ldh=new Star('ZZ',22);
ldh.sing();
console.loh(that===ldh);//true

因此不管是构造函数里面的this还是原型对象里面的this都指向我们的实例对象

7.扩展内置对象

可以通过原型对象,对原来的内置对象进行自定义的方法,比如给数组增加自定义求偶数和的功能

Array.prototype.sum=function(){
    var num=0;
    for(var i=0;i<this.length;i++){
        num+=this[i];
    }
    return num;
}
var arr=[1,2,3];
console.log(arr.sum());
console.log(Array.prototype);

在这里插入图片描述

8.继承

ES6之前没有给我们提供extends继承,我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承

8.1 call()方法

调用这个函数,并且修改函数运行时的this指向
语法:函数名.call(thisArg,arg1,arg2…)
thisArg:当前调用函数this的指向对象

function fun(){
    console.log('zz');
    console.log(this);
}
var a={
    name:'zh'
}
fun.acll();//this ===> window
fun.call(a);//this ===> a

8.2借用父构造函数继承属性

我们通常将共有的属性写到构造函数里面

//父构造函数
function Father(name,age){
    this.name=name;
    this.age=age;
}
//子构造函数
//通过call方法修改子构造函数的this指向
function Son(name,age){
    Father.call(this,name,age);
}
var son=new Son('zz',22);
console.log(son);

在这里插入图片描述

8.3借用父构造函数继承方法

我们通常将共有的方法写到原型对象上

//父构造函数
function Father(name,age){
    this.name=name;
    this.age=age;
}
Father.prototype.money=function(){
    console.log('父方法');    
}
//子构造函数
//通过call方法修改子构造函数的this指向
function Son(name,age){
    Father.call(this,name,age);
}
//让Son的原型等于Father的实例对象
Son.prototype=new Father();
//因为上述代码我们修改了原型对象,因此需要利用constructor来指向原来的原型对象
Son.prototype.constructor=Son;
//单独给子类添加一个方法
Son.prototype.exam=function(){
    console.log('考试')
}
var son=new Son('zz',22);
console.log(son);
console.log(Father.prototype);
console.log(Son.prototype.constructor);

在这里插入图片描述

因此可以根据原型链的指向方式来更好理解上述代码

在这里插入图片描述

华为OD机试双机位C卷-热点网站统计 (Py/Java/C/C++/Js/Go) 华为OD机试双机位C卷 热点网站统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为od机考真题 - 热点网站统计。 阅读详情

相关推荐

[原创]Keil工程STM32F103C8T6无缝转换到STM32F103RCT6

有个项目,老版本是STM32F103C8T6,硬件资源不够了,新版本采用STM32F103RCT6。 无缝过渡,如下: 选定芯片 宏定义改为STM32F10X_HD,USE_STDPERIPH_DRIVER 删除原有的启动汇编文件,更换为高密度器件汇编文件 时钟系统紊乱? 那得看你程序怎么写: 先看F103时钟树 int main(void) { unsigned char stat...

江东风又起 2万+

构造函数和原型

目录 1.概述 2. 构造函数 3.构造函数原型 prototype 4.对象原型 __proto__ 5.constructor 构造函数 6.原型链 1.概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念。 ES6, 全称 ECMAScript 6.0 ,2015.06 发版。但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现...

m0_51371862的博客 449

Keil开发中CMSIS Driver API缺失问题的排查与解决

本文详细解析Keil开发中CMSIS Driver API缺失问题的根源与解决方案。针对版本不匹配、安装不完整等常见原因,提供在线与离线安装的对比及详细排查步骤,重点涵盖版本兼容性分析与项目配置验证,帮助开发者彻底解决API缺失错误并预防问题复发。

rust6ferris的博客 550

js高级-构造函数和原型

ES6之前是没有类的概念的,都是通过构造函数来解决问题。现在绝大部分浏览器都支持ES6。 1-创建实例对象: 1.new Object() var a=new Object; 2.字面量 var a={}; 3.构造函数 var a=function(){ this.name='zhangsan'; this.sing=function(){alert('正在唱歌');}} var b=new a; 通过new创建实例对象,首先看到new后会开辟一个空间,然后构造函数里面的this都会

m0_59755550的博客 255

GD32F105RBT6 keil工程模板

创建GD32F105RBT6的keil初始基础工程,未来的所有外设驱动都是基于这个基础工程进行扩展。

RMDYBW的博客 1925

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 349

javaScript:用构造函数的方式实现tab选项卡(注意this指向)

效果图: 使用构造函数的方式,可以快速的实现新tab选项卡的创建,大大减少了代码量,实现了代码的优化。 <style> *{ margin:0px; padding: 0px; } .box{ width: 300px; border:2px solid pink; margin:20px auto; .

小福气的博客 1030

模型泛化能力提升:领域自适应与迁移学习

模型泛化能力提升:领域自适应与迁移学习​ ,人工智能,计算机视觉,大模型,AI,在机器学习和深度学习的应用中,模型的泛化能力是一个关键问题。泛化能力指的是模型在新的、未见过的数据上表现良好的能力。然而,实际情况中,训练数据和测试数据往往来自不同的领域,存在分布差异,这会导致模型的泛化能力下降。领域自适应与迁移学习正是为了解决这一问题而发展起来的重要技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

构造函数、原型对象prototype、实例、隐式原型__proto__的理解

(欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 建议将构造函数中的方法都定义到构造函数的原型中,那么由该构造函数创建的实例的方法都会指向同一个方法。(在构造函数内部声明的话,每创建一个实例都会重新实例化函数,那么每个实例中的函数的指向是不同的;如果定义在全局作用域中,且有很多方法,这样毫无封装性可言。) 一、属性和方法 构造函数可以定义三种属性和方法: 对象属性/对象方法:构造函数内定义的属性/方法 静态属性/静态方法:构造函数的静态属性/方法 原型属性/原型方法

 我的博客 1198

基于STM32单片机设计的智能坐垫_431

本文设计了一款基于STM32F103C8T6单片机的智能坐垫系统,该系统集成了压力传感器、SHT30温湿度传感器、薄膜加热垫、涡轮风机、语音播报模块、OLED显示屏及HC-05蓝牙模块,实现了对用户就坐状态与坐垫微环境的实时监测与智能调控。系统通过压力传感器检测用户就坐情况,自动启动久坐计时并触发语音提醒;温湿度数据用于控制通风与加热功能,以改善座椅舒适性;用户可通过按键或手机APP设置久坐时长、手动开关通风与加热,并通过OLED屏或APP实时查看环境参数与计时状态。本设计体现了嵌入式系统在健康关怀与舒适性

409

比NTP还牛逼的时间同步协议:1588v2,亚微秒级!

1588v2,又称为Precision Time Protocol Version 2,即精密时间协议的第二版本,或称为PTPv2,是一种精密时间同步协议标准,旨在实现网络中设备之间的高精度时间同步。该协议由IEEE标准组织发布,并在网络测量和控制系统中得到广泛应用。1588v2的主要目的是在计算机网络中提供高度准确的时间同步。它可用于确保不同设备之间的时钟同步,从而协调它们的操作。这对于需要协同工作的系统、无线通信基站等具有关键性的应用非常重要。

网络技术联盟站 4279

如何使用面向对象的方法实现原生js选项卡实例教程

本教程通过js面向对象的方法来封装一个选项卡的实例,在实例中讲解js的面向对象如何实现功能。 一般封装好的选项卡程序,只需要一个div元素即可。其它元素都是通过json数据来生成,所以封装好的选项卡实例,调用非常方便。先创建一个div元素,如下所示: <div class="tab_box" class="tabContainer"></div> 选项卡的样式可以到...

蒋伟平的博客 412

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1887

JavaScript高级 构造函数和原型

构造函数和原型概述成员 概述 在典型的OOP的语言中 (如java),都存在类的概念 ,类就是对象的模板 ,但是在ES6(2015年发布的ECMAscript6.0)之前 JS中并没有引入类的概念 在这之前 对象不是基于类创建的 而是用一种被称为 构造函数 的特殊函数来定义对象和他们的特征 构造函数基本介绍: 构造函数 案例 function Zwjs(name, age, sex) { this.name = name; this.age = age; this.sex = se

xihuanLilia的博客 657

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【JavaScript高级】构造函数、原型链与数据处理

构造函数中的属性和方法称为成员,JavaScript的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的this上添加。注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性方法,就是因为对象有__proto__原型的存在。如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用construct指回原来的构造函数。

qq_59306099的博客 1241

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JavaScript高级 构造函数与原型篇

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。在JS中,使用构造函数时需要注意以下两点:1.构造函数用于创建某一类对象,其首字母要大写2.构造函数要和new一起使用才有意义new 在执行时会做四件事情:1.在内存中创建一个新的空对象2.让this指向这个新的对象3.执行构造函数里面的代码,给这个新对象添加属性和方法4.返回这个新对象所以构造函数里面不需要(return)

qq_57162921的博客 1164

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JavaScript高级:构造函数与原型

本文主要内容包括: 对比面向过程与面向对象编程思想,讲解构造函数实现封装的方式,分析其内存浪费问题 引入原型对象(prototype)概念,展示如何通过原型共享方法节省内存 说明原型链的工作原理,包括对象属性查找顺序 介绍constructor属性的作用,指向原型对象的构造函数 文章通过代码示例演示了如何利用原型对象扩展数组方法,并解释了构造函数与原型方法冲突时的调用规则。

lovexixix的博客 1048

js高级 构造函数和原型

1.构造函数 构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 在JS中,使用构造函数时要注意以下两点: 1. 构造函数用于创建某一类对象,其首字母要大写 2.构造函数要和new一起使用才有意义 new 在执行时会做四件事情: ① 在内存中创建一个新的空对象。 2 让this指向这个新的对象。 ③执行构造函数里面的代码,给这个新对象添加属性和方法。 4返回这个新对象(所以构造函数里面不

weixin_44247157的博客 233

JavaScript高级之对象、类、构造函数和原型

JavaScript高级之对象、类、构造函数和原型

qq_43537721的博客 420

JavaScript 高级2 :构造函数和原型

构造函数和原型、继承、ES5中的新增方法

CaptainDrake的博客 462

js高级之构造函数与原型

构造函数和原型继承等基础知识

weixin_47976412的博客 161

JavaScript高级之构造函数和原型

1.1 概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念。 ES6, 全称 ECMAScript 6.0 ,2015.06 发版。但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。 在 ES6之前 ,对象不是基于类创建的,而是用一种称为构建函数的特殊函数来定义对象和它们的特征。 创建对象可以通过以下三种方式: 对象字面量 n

zep 276

【JavaScript高级进阶】构造函数和原型,学会prototype

构造函数原型prototype原型对象主要解决了内存浪费的问题构造函数通过原型分配的函数是所有对象所共享的。在JavaScript里每一个构造函数都有一个 prototype属性,指向另一个对象。这个prototype就是一个对象,prototype这个对象的所有属性和方法,都会被构造函数所拥有。这时候就可以使用prototype把方法放到里面供该对象所有的实例对象使用。

zhaochen1127的博客 953

JavaScript 高级—构造函数和原型(构造函数和原型、继承、ES5 中的新增方法)

目标: 能够使用构造函数创建对象 能够说出原型的作用 能够说出访问对象成员的规则 能够使用ES5新增的一些方法 1. 构造函数和原型 1.1 概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念。 ES6, 全称 ECMAScript 6.0 ,2015.06 发版。但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分..

m0_59030524的博客 1282

JavaScript高级【重点】【构造函数、实例、原型三者之间的关系】

JavaScript高级【重点】【构造函数、实例、原型三者之间的关系】

Coding 1279

JavaScript 高级 ——构造函数和原型

构造函数和原型 概述:在典型的OOP的语言中(如java),都存在类的概念,类就是对象的模版,对象就是类的实例,但是在ES6之前,JS中并没有引入类的概念。 ES6全称ECMAScript 6.0 2015.06发版 、但是目前浏览器的JavaScript是ES5版本,大多数高版本的浏览器也支持ES6,不过只是实现了ES6的部分特性和功能。 在ES6之前 ,对象不是基于类创建的,而是...

weixin_41984072的博客 198
上一篇: JS高级-面向对象编程
下一篇: JS高级-ES5中的新增方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值