前端ES5对象特性

ES6新增/特点 区别应用场景Set用于数据重组,Map用于数据储存Set:成员不能重复只有键值没有键名,类似数组可以遍历,方法有add, delete,hasMap:本质上是健值对的集合,类似集合可以遍历,可以跟各种数据格式转换。 阅读详情

ES5对象特性

对象和函数的原型

JS中每一个对象都有一个特殊的内置属性,这个特殊的对象可以指向其他的对象

  • 我们通过引用对象的属性key来获取一个value时,它会触发 Get 的操作
  • 首先检查该对象是否有对应的属性,如果有的话就使用对象内的
  • 如果对象中没有属性,那么会访问对象的prototype
  • 每一个对象都有一个原型属性

使用方式有两种:

  • 通过对象的 _proto_ 属性可以获取到(浏览器自己添加的,存在一定的兼容性问题)
  • 通过 Object.getPrototypeOf 方法可以获取

prototype属性是函数特有的属性 我们的对象只能通过Object.getPrototypeOf来查看原型。

    var obj = {
       
    }
    function foo() {

    }
    console.log(foo.prototype);

当我们这个对象有对多个共同值的时候,可以把相同的东西当如原型里,这样每次创建这个对象的时候,就可以直接调用而不是重新创建。

    function Student(name, age) {
        this.name = name
        this.age = age

        // 如果我们每个对象都创建那么这两个方法会出现很多的冗余
        // this.running = function () {
        //     console.log(this.name + "running");
        // }
        // this.eating = function () {
        //     console.log(this.name + "eating");
        // }
    }
    Student.prototype.running = function () {
        console.log(this.name + "running");
    }
    Student.prototype.eating = function () {
        console.log(this.name + "eating");
    }
    var stu1 = Student("jjj", 12)

    var stu2 = Student("hhh", 18)
Constructor属性

原型对象上面是有一个属性的:constructor,默认情况下原型都会有一个叫constructor指向当前的对象

    function Person() { }
    var PersonProtype = Person.prototype
    console.log(PersonProtype);
    console.log(PersonProtype.constructor);
    console.log(PersonProtype.constructor == Person);

image-20230304222301746

原型对象是可以重写的,当我们需要给原型添加更多的属性的时候一般我们会选择重写原型对象

我们也可以改变原型对象中constructor的指向的使用

//改变指向对象
    Person.prototype={
        constructor:Person
    }
//修改枚举类型
  Object.defineProperty(Person.prototype,"constructor",{
        enumerable:false
    })

这里要注意的是原生的constructor是不可枚举的,但是修改constructor的时候会让constructor的特性被设置为true这个时候需要修改一下对象默认属性设置

创建对象的内存表现:

image-20230304215608997

如果我们向对象加入属性在之后的变化:

image-20230304215618077

多种继承方式

继承

面向对象有三大特性:封装、继承、多态

  • 封装:我们前面将属性和方法封装到一个类中,可以称之为封装的过程
  • 继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中)
  • 多态:不同的对象在执行时表现出不同的形态

这里主要将JS中的继承,在了解继承之前我们需要了解JS中的原型链机制,这个是之后理解的关键

原型链

在js中我们不断的获取原型对象,原型链最顶层的原型对象就是Object的原型对象

[Object: null prototype] {}这种提示一般有两个情况:

  • 该对象有原型,且这个原型的属性指向null或者最顶层了
  • 这个对象有很多的默认属性方法

ps:Object是所有类的父类

我们也可以对原型链做一些自定义操作,比如这样:

    var obj = {

    }
    obj.__proto__ = {

    }
    obj.__proto__.__proto__ = {

    }
    obj.__proto__.__proto__.__proto__ = {
        name: "小冷"
    }

原型链实现继承

function Person(){
    this.name = "l"
}

var p = new Person()
stu.prototype = p
//name == l
stu.prototype.studying = function(){
    console.log(this.name+"studying")
} 

我们可以通过赋值原型的形式来实现继承,但是有一些弊端

  1. 直接打印对象是看不到属性的
  2. 这个属性会被多个对象共享,如果是引用类型就会造成问题
  3. 不能给父类传递参数,没法定制化
借用构造函数继承

为了解决原型链继承中存在的问题,constructor stealing应运而生 ,借用继承的做法非常简单:在子类型构造函数的内部调用父类型构造函数

  • 因为函数可以任意调用
  • 因此通过apply和call也可以再新创建的对象上实行构造函数
    function Person(name, age, height, address) {
        this.name = name
        this.age = age
        this.height = height
        this.address = address
    }
    function Student(name, age, height, address, sno, score) {
        Person.call(this,name, age, height, address)
        this.sno = sno
        this.score = score
    }

可以使用父类的构造函数来实现创造,解决之前原型链的问题 在ES6之前一直是保持的这个方式,但是这个继承方式依然不是很完美

  • 无论在什么情况下,都会调用两次父类构造函数。 一次是创建子类原型,一次是构造函数
  • 所有的子类都会有两份父类的属性
继承最终方案

在继续的发展中, JSON的创立者道格拉斯, 提到了新的继承方法,这也是目前es5 阶段最合适的继承方案 寄生组合继承

  • 结合原型类继承和工厂模式
  • 创建一个封装继承过程的函数,在这个函数的内部来增强对象,最后将这个对象返回
    function Person(name, age, height, address) {
        this.name = name
        this.age = age
        this.height = height
        this.address = address
    }
    Person.prototype.running = function () {
        console.log(this.name + " running");
    }
    function Student(name, age, height, address, sno, score) {
        Person.call(this, name, age, height, address)
        this.sno = sno
        this.score = score
    }
    // 原型继承
    var obj = Object.create(Person.prototype)
    console.log(obj.__proto__ === Person.prototype);
    Student.prototype = obj
    // 上到真是环境 会封装用 为了兼容性可以多一个创造类的方法
    function object(o){
    function F(){}
    F.prototype = o
    return new F()
    }
    function inherit(Subtype, Supertype) {
        Subtype.prototype = object(Supertype.prototype)
        // 需要构造方法
        Object.defineProperty(Subtype, "constructor", {
            enumerable: false,
            configurable: this,
            writable: true,
            value: Subtype
        })
    }
    inherit(Student, Person)
    Student.prototype.eating = function () {
        console.log(this.name + "eating");
    }
    var stu = new Student("小明");
    stu.eating()

对象方法补充

hasOwnProperty : 对象是否有某一个属于自己的属性

in/for in 操作符: 判断某个属性是否在对象或者对象的原型上

instanceof : 用于检测构造函数的原型,是否出现在某个实例对象的圆形脸上

isPrototypeOf:用于检测某个对象,是否出现在某个实例对象的原型链上

【ES6新特性】Symbol用法解析 你以为Symbol只是生成唯一值?Too young!本文将带你解锁Symbol在元编程、协议定制等领域的黑科技玩法。 阅读详情

相关推荐

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

Javascript学习之路:关于ES5内置函数Object的新方法--Object.create()

Object是Object类型得构造函数,所以typeof Object返回得是Function而Object.prototype对象才是所有对象的父对象Object作为构造函数,有三种情况Object()如果传入参数null,undefined,或者不传入,则相当于new Object(),创建有原型的空对象Object(原始类型值)将原始类型的值转化为Object类型,也等效于new Object(原型类型值)Object(引用类型的对象)什么都不做,还返回原对象。

Code_King006的博客 321

STM32驱动数码管:从硬件连接到动态显示实现

本文详细介绍了使用STM32单片机驱动数码管的完整流程,从硬件连接到软件实现。内容涵盖共阳/共阴数码管原理、GPIO配置、段码表生成,并重点解析了多位数码管动态显示的核心技术,包括动态扫描原理、消影处理及实战代码,帮助开发者快速掌握这一嵌入式开发基础技能。

p5l2m9n4o6q的博客 574

javascript ES5 Object对象

javascript ES5 Object对象 原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Object.getOwnPropertyNames() Object.obs...

weixin_30511107的博客 145

告别卡顿!用LVGL+DMA刷新STM32F407的SPI屏幕,性能提升实战

本文详细介绍了如何通过LVGL+DMA技术优化STM32F407驱动SPI屏幕的性能,实现接近60FPS的流畅刷新。从硬件瓶颈分析到SPI与DMA的精细化配置,再到LVGL的双缓冲机制与局部刷新优化,提供了一套完整的性能提升方案。特别适合嵌入式GUI开发中面临卡顿问题的工程师参考。

weixin_42531588的博客 378

Win11 C盘瘦身终极指南:哪些能删/能移/不能碰?附详细目录清单

本文提供了一份详细的Win11 C盘瘦身终极指南,清晰区分了可安全删除、适合迁移以及绝对不能触碰的系统目录。文章不仅列出了具体的文件夹清单与操作建议,还介绍了使用符号链接和Robocopy进行安全迁移的高阶方法,并附带了自动化脚本,帮助用户从根本上解决C盘空间不足的问题,同时确保系统稳定。

weixin_29246195的博客 1543

ES5_Object对象方法扩展

ES5给Object扩展了一些静态方法,常用的两个: 1.Object.create(prototype,[descriptors])       作用:以指定对象为原型创建新的对象     为新的对象指定新的属性,并对属性进行描述:              value:指定值             writable:标识当前属性值是否可以修改,默认为false          ...

每文的博客 932

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3776

js版本之ES5特性简述【Object、Array方法】(一)

以此类推。注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序。

Cshaosun的博客 1312

【ARM Coresight | AMBA BUS | Cache 与 MMU/MPU | CoreLink | GCC | CSH 专栏导读】

1. ARM Coresight(SoC-400/SoC-600) 专栏 2. ARMv8/v9 CPU/Cache 专栏 3. Linux ARM AMBA 总线 专栏 4. Trace32/DS-5 专栏。。。

CodingCos的博客 8239

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2516

ES5中Object的几种方法

ES5中Object的几种方法create Object.create(proto[, propertiesObject])) 该属性方法的作用是,新建个对象,继承参数proto的原型,同时通过propertiesObject参数添加新的属性,同时设置这些属性的一些操作权限及操作产生的回调举个栗子var a=function(x){ this.x=x } a.prototype.getI

qq_35999481的博客 1038

YOLOv11改进 | Neck篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov11(全网独家创新)

本文给大家带来的最新改进是利用分层特征融合块HFFB创新yolov11的neck部分我称之为HFPN,这个模块可以融合局部特征、全局特征、中间特征将三种特征融合在一起辅助yolov11进行检测,经过我的设计分为三种可以针对大目标、小目标、标准目标的检测方式均不同,大家可以根据自己的数据集进行不同的选择,本文的内容为我独家创新。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、原理介绍三、核心代码四、添加方法4.1 修改一4.2 修改二4.3 修改三4.4 修改四。

Snu77的博客 5204

HTML5、CSS3、ES5/6新特性

新增语义化标签<header><nav><article><section><footer>表单增强Web存储通过Canvas画图</const'myCanvas';'#FF0000';</${${

2503_90377662的博客 934

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ES5-ES11语法(包含数组,对象,字符串的方法)

ES6到ES11新增,字符串、对象及数组的常用方法汇总

vh_YUNYANGYUMO的博客 1707

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ES5新增

-----------------------------ES5新增---------------------- 严格模式 // 严格模式是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在“严格”的操作语境中。使用方法是在作用域开头加上这样一条语句:"use strict"; 对象新增: // 获取对...

weixin_30699463的博客 176

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2024年前端最全ES5,ES6的简要说明及浏览器支持性总结,华为Web前端面试真题解析

(7)Object.getOwnPropertyDescriptor() 返回对象上一个自有属性对应的属性描述符(不需要从原型链上进行查找的属性)。(6)Array.prototype.lastIndexOf() 返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。callback:用来测试数组的每个元素的函数。(7)Array.prototype.map() 创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

2301_82243710的博客 1676

ES5-ES6的部分新特性

ES5-ES6新特性介绍 ES5新特性 严格模式 JSON的对象 Object扩展 Array扩展 function扩展 ES6新特性 新关键字 let关键字 const定义一个常量 变量的结构赋值 模版字符串 简化对象写法 三点运算符 形参的默认值 class类 字符串扩展 数值扩展 数组扩展 Object扩展 Set和Map数据结构 遍历

木头房子的格子铺 932

ES5 中的一些拓展

写在开头 本文将带你深入理解ES5 中的一些拓展 后续的文章都会与前端有关,欢迎各位同路途的人一起交流学习,3月份又是努力的开头,加油! 推荐阅读:来自 菜鸟 的 前端实习面经 大厂 春招实习生 ES 6专栏 -> 传送门 如果想更多了解ES6,请参考之前写过的一些文章: ES6 一文弄懂 var let const 三剑客区别 吊打面试题 ES6 面试题:你能说出浏览器上到此支持多少个中...

超逸の学习技术博客 1152

#24class静态成员

只属于函数对象而不属于实例对象的称为静态成员ES5:ES6:

sanda_nd的博客 104

概述ES5和ES6中面向对象的实现方法

ES6的class就是语法糖而已,ES6的class的本质还是原型继承,理解JavaScript的原型继承,才能hold住ES6的class实现自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

2301_79099606的博客 645

javascript语言ES5版本详解(一)

外链图片转存中…(img-f9bymGkf-1711676695601)]

2301_79835671的博客 1131

合并两个数组并去重(ES5和ES6两种方式实现)

合并两个数组并去重(ES5和ES6两种方式实现) ES6实现方式 let arr1 = [1, 1, 2, 3, 6, 9, 5, 5, 4] let arr2 = [1, 2, 5, 4, 9, 7, 7, 8, 8] function uniqueArr(arr1,arr2) { //合并两个数组 arr1.push(...arr2)//或者arr1 = [...arr1,.....

weixin_30530523的博客 1247

前端之ES6

10.数组的扩展方法:from(),of(),copywithin(),find(),findIndex(),entries()、keys()、values(),includes(),MDN教程:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript。比如变量提升,内置对象的方法不灵活,模块化实现不完善。ES6阮一峰教程:http://es6.ruanyifeng.com。12.生成器Generator。15.async的用法。8.Symbol类型。

m0_45153776的博客 235

学习ES6快速入门

今天在慕课网学习了“快乐动起来呀”老师的《ES6快速入门》 https://www.imooc.com/learn/955 1.课程介绍:   ES使用情况:     jquery==》ES3     vue==》ES6     recat==》ES6   课程优点:     同样的问题,用ES3,ES5,ES6,三种方法对比学习,能很快了解ES6的优势。   对ES6冰山一角的...

weixin_30904593的博客 183

前端笔记-ECMAScript语法概览

这里我将大概记录ES与JS大概不一样的部分,方便联合记忆。

MrsBaek的博客 887
上一篇: 前端进阶JS函数增强与对象增强
下一篇: Android 操作系统日历完成提醒功能 附带开关闹钟 适配高版本安卓
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值