JavaScript 高级程序设计

article/2025/10/5 21:51:18

理解原型对象

无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
在默认的情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个包含一个指向prototype属性所在函数的指针。

你不知道的 JavaScript

JavaScript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]]属性都会被赋予一个非空的值。
  • 任何对象都拥有__proto__(隐式原型)属性,一般指向他们的构造函数的原型(prototype)
var a = new Array();a.__proto__ === Array.prototype
  • 原型链的顶端是 Object.prototype,其__proto__ 为 null。也可以理解为:除了Object.prototype所有的对象都有原型。
Object.prototype.__proto__ === null;
  • 所有的函数都拥有 prototype(显式原型)属性
任何函数的 prototype.__proto__ 都指向 Object.prototype
  • 所有的函数都是 Function 的实例
function abc(){alert(1)
};abc.__proto__ === Function.prototypevar obj={},var arr=[];
obj.__proto__ === Object.prototype;
arr.__proto__ === Array.prototype;
  • 更奇葩的来了,Object Function Array 本身也都是一个函数,由于是最常用的,所以 JavaScript 帮我们实现了
Function.__proto__ === Function.prototype;
Object.__proto__ === Function.prototype;
Array.__proto__ === Function.prototype;
  • 原型对象中又拥有 constructor 属性,该属性指向函数本身,这个好理解
Function.prototype.constructor === Function;
Object.prototype.constructor === Object;
Array.prototype.constructor === Array
  • 原型链

    如果想要找到一个对象的属性,首先会先在自身查找,如果没有,就会通过proto属性一层层的向上查找,直到原型链的顶端 Object.prototype(proto: null)见第 2 这种通过某种纽带(proto)将对象之间形成一种继承关系 这种关系呈现出一种链条的形状 将这种链条称之为原型链

现在我们知道了,[[Prototype]]机制就是存在于对象中的一个内部链接,它会引用其他对象。

通常来说,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就会继续在[[Prototype]]关联的对象上进行查找。同理,如果在后者中也没有找到需要的引用就会继续查找它的[[Prototype]],以此类推。这一系列对象的链接被称为“原型链”。

  • 根据 constructor 推论出:
console.log(fn.constructor===Function); // true
// 解析:
// fn自身并没有constructor属性,所以他会顺着原型链向上找
// fn.__proto__ 指向的是 Function.prototype 见第4
// Function.prototype.constructor  === Function
console.log(Function.constructor === Function); // true
console.log(Object.constructor === Function);   //true
  • Function.prototype.proto === Object.prototype

Function 是一个特殊的例子 他创造了所有的函数,但他自身就是也是一个函数 总不能自己创造自己吧 所以他的上级是 Object.prototype

构造函数创建对象字面量原型图;

  function Animal (color) {this.color = color
}
var dog =  new Animal ('黑色')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3vXKHJm-1648536390021)(https://github.com/zhuqiaoz/biicai_git/raw/master/html/javascript/img/%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%AD%97%E9%9D%A2%E9%87%8F%E5%8E%9F%E5%9E%8B%E5%9B%BE.png)]

完整对象字面量原型图:

var obj = { name: '陈二狗' }

完整对象字面量原型图

数组原型链

var arr = ['第一个数','第二个数','第三个数']

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jlN8Ph0K-1648536390023)(https://github.com/zhuqiaoz/biicai_git/raw/master/html/javascript/img/%E6%95%B0%E7%BB%84%E5%8E%9F%E5%9E%8B%E9%93%BE.png)]

基本包装类型原型链

var str  = new String('str')  // var str = 'str'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YqWmZlo-1648536390023)(https://github.com/zhuqiaoz/biicai_git/raw/master/html/javascript/img/%E5%9F%BA%E6%9C%AC%E5%8C%85%E8%A3%85%E7%B1%BB%E5%9E%8B%E5%8E%9F%E5%9E%8B%E9%93%BE.png)]

深浅拷贝

浅拷贝:对与数组和对象,浅拷贝更像是复制对象。一方改动另一方会体现出来。实现方法:如果是数组,我们可以利用数组的一些方法比如:slice、concat 返回一个新数组的特性来实现拷贝。

深拷贝:就是指完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。 实现:

var deepCopy = function(obj) {if (typeof obj !== 'object') return;var newObj = obj instanceof Array ? [] : {};for (var key in obj) {if (obj.hasOwnProperty(key)) {newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];}}return newObj;
}

性能问题

尽管使用深拷贝会完全的克隆一个新对象,不会产生副作用,但是深拷贝因为使用递归,性能会不如浅拷贝,在开发中,还是要根据实际情况进行选择。


http://chatgpt.dhexx.cn/article/QtCN2fxp.shtml

相关文章

js高级程序设计(第一章)

1.什么是JavaScript 1.1 简短的历史回顾 出现背景:当时,验证简单的表单,需要大量与服务器的往返通信成为用户的痛点。 出现时间:1997 年,JavaScript 1.1 作为提案被提交给欧洲计算机制造商协会(Ecma&…

JavaScript高级程序

文章目录 1. JavaScript 实现1.1 ECMAScript1.2 DOM1.3 BOM1.4 小结 1. JavaScript 实现 虽然 JavaScript 和 ECMAScript 基本上是同义词,但 JavaScript 远远不限于 ECMA-262 所定义的那样。 完整的 JavaScript 实现包含以下几个部分:  核心(ECMAScript)  文档…

JavaScript高级程序设计——读书笔记

文章目录 第1章 JavaScript简介第2章 在HTML中使用JavaScript第3章 基本概念第4章 变量、作用域、内存问题第5章 引用类型第6章 面向对象的程序设计第7章 匿名函数第8章 BOM第9章 客户端检测第10章 DOM第11章 DOM2和DOM3第12章 事件第13章 表单脚本第14章 错误处理与调试第15章…

javascript高级程序设计第四版(javascript高级程序设计第四版)

如何学习 JavaScript 先说说学js的条件 论条件,咱是文科生,大学专业工商管理,和计算机毛关系都没;有人说英语,读了四年大学,很遗憾,咱还四级没混过;就咱这条件都学得乐呵呵的&#x…

JavaScript高级程序设计学习笔记----初识JavaScript

一、JavaScript概述 1.JavaScript 介绍: 简称JS,是一种浏览器解释型语言,嵌套在HTML文件中交给浏览器解释执行。主要用来实现网页的动态效果,用户交互及前后端的数据传输等。 2.JavaScript 组成: 核心语法 - ECMAScr…

JavaScript高级程序设计 第4版

文章目录 第 1 章  什么是JavaScript1.2JavaScript1.2.1 ECMAScript1.2.2 DOM1.2.3 BOM 第 2 章 HTML中的JavaScript2.1 script元素2.1.1 标签占位符2.1.2 推迟执行脚本2.1.3 异步执行脚本2.1.4 动态加载脚本2.1.5 XHTML中的变化 2.2 noscript元素 第 3 章 语言基础3.1…

javascript高级程序设计pdf(JavaScript高级程序设计PDF版)

javascript入门书籍推荐 javascript权威指南 第六版 javascript高级程序设计 第三版 都是干货啊javascript高级程序设计!经典中的经典《javascript权威指南》 《javascript入门经典》第五版完整版 求《JavaScript高级程序设计(第3版)》PDF下载地址 权威指南 javascript高级教程…

JavaScript 高级程序设计(第3版)

内容简介 ECMAScript 5 和 HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为 JavaScript 增添了很多适应未来发展的新特性。《JavaScript 高级程序设计(第3版)》这一版除增加5章全新内容外,其他章节也有较大幅度…

Javascript高级程序设计第四版详细测评

简介 哈喽大家好, 我是大圣,上次做了一个js的书籍测评,评价还不错,在做css和node之前,再做几本书的详细推荐吧, 国庆今天又在家好好读了几本具有代表性的 javascript高级程序设计【红宝书】javascript忍者秘籍你不知道…

JavaScript高级程序设计 第4版(中文高清)扫描版

1. JavaScript组成 核心ECMAScript文档对象模型DOM浏览器对象模型BOM 1.2.1 ECMAScript 定义语言的基础 规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象 js nodejs 都实现了ECMAScript 1.2.2 DOM 文档对象模型 Document Object Model …

Java新手入门值得看的五本书!

很多知识都可以通过书本学习,Java学习也需要书籍,尤其是对于Java初学者和Java自学者来说尤为重要,选择了好了配套书籍在自学的路上可以达到事半功倍的效果,下面为Java初学和自学的朋友推荐几本合适的书籍希望对大家有所帮助。 1、…

学Java可以看哪些书?6本Java书籍推荐

学Java有哪些推荐书籍可以看?很多人都会有这样的疑问。今天,小千整理了一些Java经典书籍,分享给大家。 如果你初出茅庐,对Java感兴趣,想要学Java,在这行深钻研,那么这些书绝对不能少。如果你已…

Java项目:图书馆管理系统思路分析

当当当当~~~~欢迎大家阅读,今天和我一起来整理图书馆管理系统项目的思路分析吧! 一、项目说明 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工…

必读的10本有关Java的书籍

想知道如何提高你对Java的了解?想成为更好的Java开发人员?来对地方了 我将分享一些最好的Java书籍。这些书经受住了时间的考验,随着岁月的流逝变得越来越重要。 不管是在今年明年,你总有很多东西要学,这也就是为什么…

Java程序员必读的10本书籍

以下列出了10本书,对于任何希望提高Java知识和理解的Java程序员来说都是必不可少的。 如果你是一名程序员,想知道如何提高你对Java的了解或者成为更好的Java开发人员,那你就来对地方了。在本文中,我将分享一些最好的Java书籍。这…

从入门到进阶,JAVA书籍的最佳阅读顺序!

本文首发于知乎,已获得1000赞和收藏。 原文链接:https://www.zhihu.com/question/269505829/answer/1791006152 先介绍下本人的情况,希望对大家学习Java之路有一定帮助。 本人本科完全没接触过Java,后自学Java,对整个…

年底了,感谢大家2022年的支持,虚竹哥送10本JAVA好书

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主&#x1f3…

Java 图书管理系统

学习了类和对象之后,就可以自己来做个小的项目来提升自己的能力了。本文章就来说明如何来做一个简单的图书管理系统。写一些小项目是一种很锻炼逻辑和熟悉语法的好方法。 在做这些项目的时候,要明白一点是我们的Java是面向对象的,要使用面向对…

JAVA学习,你必读的5本JAVA书籍

给广大JAVA爱好者推荐JAVA教程,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物,第四版翻译的已经不错了,其实如果英文OK的人还是读原版比较好。 …

JAVA实战小项目——图书馆管理系统

✨前言 某日在逛b站的时候看到有人做出了图书馆管理系统,在仔细梳理自己以学过的java相关知识点后,发现还是能够实现的!😎 需要用到的相关知识点:向上转型,动态绑定,重写,继承&…