JavaScript 函数的特性与原型链讲解

原型、原型链图解(详细易懂2026) 构造函数是使用了new关键字的函数,用来创建对象,所有函数都是Function()的实例 原型对象是用来存放实例对象的公有属性和公有方法的一个公共对象,所有原型对象都是Object()的实例 原型链又叫隐式原型链,是由__proto__属性串联起来,原型链的尽头是Object.prototype 阅读详情

开篇语

这次给大家带来一个关于 JavaScript 函数与原型链之间的关系的分享,将会从函数开始讲起,一直讲到整个原型链是什么样子的,希望能给大家带来帮助。
函数的三种使用方式
JavaScript 中的函数大致有以下三种使用方式:
一、作为普通函数来使用
例如
// 定义函数
function foo() {}
// 调用函数
foo();
复制代码二、作为构造函数来使用
当一个函数被用来创建新对象的时候,就把它叫做:构造函数。
例如
// 按照惯例,作为构造函数的函数名首字母需要大写
function Foo() {}
const obj = new Foo();
复制代码这时对于对象 obj 来说,函数 Foo 就叫做它的构造函数。
三、作为对象来使用
访问对象的属性可以使用点操作符和中括号来访问
例如
function foo() {}
foo.name = ‘tom’;
foo[‘age’] = 20;
复制代码以上这三种使用方式中,以普通函数来调用的方式大家都懂,这里不再赘述。本文主要讲解的就是当一个函数被作为构造函数来使用和被作为对象来使用的时候,分别是什么样的,以及它们之间与原型链的关系是什么样的。
预留问题
在讲接下来的内容之前,我们先来看几个问题:
// 首先,定义一个函数,将会作为构造函数
function Foo() {}

// 实例化出来一个对象
const obj = new Foo();

// 在 Object 的原型上定义一个属性:objProp
Object.prototype.objProp = ‘我是 Object 原型上的属性’;

// 在 Function 的原型上定义一个属性:funcProp
Function.prototype.funcProp = ‘我是 Function 原型上的属性’;

// 你预想一下,以下这些分别会输出什么?
console.log(obj.objProp) // ?
console.log(obj.funcProp) // ?

console.log(Foo.objProp) // ?
console.log(Foo.funcProp) // ?

console.log(Object.objProp) // ?
console.log(Object.funcProp) // ?

console.log(Function.objProp) // ?
console.log(Function.funcProp) // ?

console.log(Array.objProp) // ?
console.log(Array.funcProp) // ?

复制代码构造函数
接下来会讲解函数的第二个特性,作为构造函数来使用的时候,它是什么样的。
使用 new 操作符创建对象
当我们使用 new 操作符来从构造函数创建对象的时候,会经历以下几个步骤:

创建一个空对象:{}。
把这个空对象的原型链 proto 指向构造函数的原型对象。
把新对象作为上下文来调用构造函数,即绑定 this,这样新对象才能访问到构造函数中的属性。
如果该函数没有返回对象,则返回这个新对象。

文字描述不太好理解,我们用代码来描述一遍,然后再对比着看一下:
// 新建一个构造函数
function Foo() {}
// 使用 new 操作符实例化一个对象
const obj_foo = new Foo()
// ========创建对象的过程:
// 1. 创建一个空对象:{}。
const obj = {};
// 2. 原型链的链接过程
obj.proto = Foo.prototype;
// 3. 把新对象作为函数的上下文,即绑定 this
Foo.apply(obj, arguments);
// 4. 因为 Foo 没有返回对象,所以就返回这个新对象
return obj;
// ========END
// 这时 obj_foo 就是返回出来的新对象了
复制代码__proto__ 是什么?
首先你要记住:只有对象才会有 proro 这个属性。它是 js 得以实现原型链的关键,因为它会指向构造函数的原型对象,即 prototype 属性上的对象,而构造函数原型对象上的 proto 又指向上一级,即:构造函数.prototype.proto -> 上一级构造函数.prototype,以此类推层层往上,就形成了我们所说的原型链。如果不理解,请继续看下文:
prototype 是什么?
前面一直提到 构造函数.prototype,这个属性是函数特有的一个属性,它是构造函数的原型对象,所有由它构造出来的对象都会从这个原型对象上继承属性和方法(参考 MDN:JavaScript 是一种基于原型的语言,每个对象都拥有一个原型对象,对象以其原型为模板,从原型继承方法和属性)。就像前面的例子:const obj_foo = new Foo(),obj_foo 的原型对象就是构造它的函数 Foo 的 prototype,obj_foo 从 Foo.prototype 继承了方法和属性。
又因为 构造函数.prototype 是一个对象,所以它就会有 proto 这个属性,说明原型对象也是由一个构造函数创建出来的,即:构造函数.prototype.proto -> 上一级构造函数.prototype。
这下你能理解 proto、prototype 和原型链之间的关系了吧,正因为有了它们俩 JavaScript 才得以实现原型链。

特殊的构造函数
先来回顾一下 JavaScript 中的一些内建构造函数吧,比如:Object、Function、Number、Array、String等。
既然是构造函数,就可以用来创建对象,比如:
var a = new Number(‘123’); // a === 123 is false
// 因为 Number.prototype 上有 toString() 方法,于是 a 也就继承了该方法:
a.toString(); // a === ‘123’ is true
var b = new String(123); // b === ‘123’ is false
a instanceof Number; // is true
b instanceof String; // is true
复制代码有了上述印象,接下来就跟大家讲解其中最核心最特殊的两个构造函数:Object 和 Function。
Object 构造函数
用来创建对象,例如:
const obj = new Object();
复制代码Object 除了是一个构造函数可以用来创建对象以外,它还拥有一个很硬核的能力:派生所有的其它构造函数。
这里用了“派生”二字,在理解上是把它当做一个基类或者说父类来看待的。
也就是:所有的其它构造函数都是由 Object 这个构造函数派生出来的(子类)。
用代码解释一下(注:JavaScript 中没有明确的类的概念):
// 父类 Object
class Object {}
// 子类 MyFunction
class MyFunction extends Object {}
复制代码正因为是由 Object 构造出来的,那么构造函数的原型链就指向了 Object 的原型对象(参考 new 的第二步过程可以加以理解):
所有构造函数.prototype.proto === Object.prototype
重点
因为 Function 也是一个构造函数,那么就可以推导出:
Function.prototype.proto === Object.prototype
Function 构造函数
用来创建函数对象,例如:
const sum = new Function(‘a’, ‘b’, ‘return a + b’);
sum instanceof Function; // true
复制代码在这里把 sum 叫函数对象,是因为它确实是由 Function 构造出来的对象,但是它跟我们平常定义一个 sum 函数是一样的,这就是我当初的迷惑点所在,即函数有多种表示形态,可以是普通函数,可以是构造函数也可以是函数对象。
我们不难得出:所有的函数对象都是由 Function 构造出来的
证明:sum.proto === Function.prototype
重点
进一步可以推导出:Object.proto === Function.prototype
阶段小结

函数有三种形态:普通函数、构造函数、函数对象;
当使用 new 操作符调用构造函数,会创建一个新对象;
proto 只有对象才有这个属性,它指向对象的构造函数的原型对象;
prototype 是构造函数的原型对象;
所有的构造函数都是由 Object 创建出来的;
所有的函数对象都是由 Function 创建出来的。

函数是如何确定形态的
前面我们讲了构造函数、函数对象这些东西,那么函数是如何确定最终形态的呢?答案是:在使用的时候。
使用 new 来调用它,那么它就是一个可以创建对象的构造函数,如果使用点或者中括号来调用它,那么它就又变成了一个对象(注:排除 prototype 属性)。
我在前面标了两个重点公式:
// 1
Function.prototype.proto === Object.prototype
// 2
Object.proto === Function.prototype
复制代码再次解释一下:
1、看到 Function.prototype 就说明 Function 此时是被当做构造函数来使用的,前面说过所有构造函数都是由 Object 构造出来的。
2、看到 Object.proto 就说明 Object 此时是被当做对象来使用的,前面说过所有函数对象都是由 Function 创建出来的。
Object 和 Function 之间的关系非常特殊,根据不同的形态可以互生。
解决预留问题
这下我们就可以来解决预留问题了。
// 首先,定义一个函数,将会作为构造函数
function Foo() {}

// 实例化出来一个对象
const obj = new Foo();

// 在 Object 的原型上定义一个属性:objProp
Object.prototype.objProp = ‘我是 Object 原型上的属性’;

// 在 Function 的原型上定义一个属性:funcProp
Function.prototype.funcProp = ‘我是 Function 原型上的属性’;
复制代码问题:
1、
console.log(obj.objProp) // ?
复制代码
答案:

因为对象的原型链指向构造函数的原型对象,所以:obj.proto -> Foo.prototype,
因为所有构造函数都是由 Object 派生出来的,所以:Foo.prototype.proto -> Object.prototype
因为 Object.prototype 上有 objProp 这个属性,所以 obj.objProp === ‘我是 Object 原型上的属性’

2、
console.log(obj.funcProp) // ?
复制代码
答案:

因为对象的原型链指向构造函数的原型对象,所以:obj.proto -> Foo.prototype,
因为所有构造函数都是由 Object 派生出来的,所以:Foo.prototype.proto -> Object.prototype
由于在 Object.prototype 上找不到 funcProp 属性,根据原型链继续找:Object.prototype.proto -> null
找不到,返回 undefined

3、
console.log(Foo.objProp) // ?
复制代码
答案:

Foo.objProp 是把 Foo 当做对象来使用的,此时它是一个函数对象,所以它是由 Function 创建出来的:Foo.proto -> Function.prototype
由于在 Function.prototype 上找不到 objProp 属性,根据原型链继续找:Function.prototype.proto -> Object.prototype
在 Object.prototype 上找到了 objProp 属性,所以 Foo.objProp === ‘我是 Object 原型上的属性’

4、
console.log(Foo.funcProp) // ?
复制代码
答案:

Foo.funcProp 是把 Foo 当做对象来使用的,此时它是一个函数对象,所以它是由 Function 创建出来的:Foo.proto -> Function.prototype
在 Function.prototype 上找到了 funcProp 属性,所以 Foo.funcProp === ‘我是 Function 原型上的属性’

5、
console.log(Object.objProp) // ?
复制代码
答案:

Object.objProp 是把 Object 当做对象来使用的,此时它是一个函数对象,所以它是由 Function 创建出来的:Object.proto -> Function.prototype
在 Function.prototype 上找不到 objProp 属性,根据原型链继续找:Function.prototype.proto -> Object.prototype
在 Object.prototype 上找到了 objProp 属性,所以 Object.objProp === ‘我是 Object 原型上的属性’

6、
console.log(Object.funcProp) // ?
复制代码
答案:

Object.funcProp 是把 Object 当做对象来使用,此时它是一个函数对象,所以它是由 Function 创建出来的:Object.proto -> Function.prototype
在 Function.prototype 上找到了 funcProp 属性,所以 Object.funcProp === ‘我是 Function 原型上的属性’

7、
console.log(Function.objProp) // ?
复制代码注:为了避免混淆,Function 表示对象, %Function 表示构造函数

答案:

Function.objProp 是把 Function 当做对象来使用的,此时它是一个函数对象,所以它是由 %Function 创建出来的:Function.proto -> %Function.prototype
在 %Function.prototype 上找不到 objProp 属性,根据原型链继续找:%Function.prototype.proto -> Object.prototype
在 Object.prototype 上找到了 objProp 属性,所以 Function.objProp === ‘我是 Object 原型上的属性’

8、
console.log(Function.funcProp) // ?
复制代码
答案:

Function.funcProp 是把 Function 当做对象来使用的,此时它是一个函数对象,所以它是由 $Function 创建出来的:Function.proto -> %Function.prototype
在 %Function.prototype 上找到了 funcProp 属性,所以 Function.funcProp === ‘我是 Function 原型上的属性’

9、
console.log(Array.objProp) // ?
复制代码答案:自己尝试着分析一下吧,欢迎在评论区给出
10、
console.log(Array.funcProp) // ?
复制代码答案:自己尝试着分析一下吧,欢迎在评论区给出
原型链图片
我画了一张原型链的图片,供大家对比着上述的流程作参考:在这里插入图片描述

如果本文有什么错误之处,还请大家帮忙指出,我会继续改进。

作者:梓航
链接:https://juejin.im/post/5de7b4fa6fb9a0164577bc24
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

JavaScript编程实例精讲 JavaScript 是一种高级的、解释执行的编程语言,广泛用于网页开发,可以创建动态交互式内容和增强用户体验。诞生于1995年,由Netscape公司的Brendan Eich创造,起初称为LiveScript,后随浏览器市场的需要迅速更名为JavaScript。由于其轻量级的脚本语言特性,JavaScript成为了前端开发的三大核心技术(HTML、CSS、JavaScript)之一。 阅读详情

相关推荐

深入掌握JavaScript学习笔记

本文还有配套的精品资源,点击获取 简介:本文是关于JavaScript学习的详细笔记,适合初学者和有基础的开发者。笔记涵盖了从基础到高级的多个方面,包括变量、数据类型、控制流、函数、对象、数组以及高级概念如函数表达式、this关键字、闭包、原型链。同时,还介绍了ES6的新特性,如let与const、解构赋值、箭头函数、Class和模块系统。另外,还包括了关于DOM操作、AJ...

weixin_42629522的博客 615

3.27(原型链初体验)

YX0711的博客 407

告别RXTX:SpringBoot集成jSerialComm实现更现代的串口通信(附完整代码对比)

本文详细介绍了如何从传统的RXTX库迁移到jSerialComm,实现SpringBoot项目中更现代的串口通信。通过对比两种技术的依赖配置、API设计和跨平台支持,展示了jSerialComm在简化部署、提升性能和增强稳定性方面的优势,并提供了完整的代码示例和实战经验。

weixin_42522964的博客 285

JavaScript 函数、原型和原型链详解

原型和原型链详解 一、JS函数的四种含义: 首先执行一段代码: function Fun() {}; var fun1= new Fun(); console.log(fun1 instanceof Fun); //其执行结果为true;说明JavaScript里面确实存在着类与对象(fun1为对象,Fun为类)。 fun1.prototype //undefined; Fun.p...

baidu_41922630的博客 769

深入解析路科验证V0实验lab1:SV接口与时钟块实战

本文深入解析了路科验证V0实验Lab1的核心内容,重点阐述了SystemVerilog接口与时钟块在验证环境搭建中的关键作用。通过拆解router_io接口设计、时钟块同步机制及程序块封装,详细讲解了如何构建稳定可靠的验证通信基础,并提供了复位时序分析与常见调试技巧,为后续复杂验证打下坚实基础。

peach的博客 430

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记

生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训...

weixin_43227526的博客 5489

原型原型链总结

原型 原型是函数特有的,构造函数制造出对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。 我们先写一个构造函数 function Person() { } var person = new Person(); person.name = 'luoxi'; console.log(person.name) // luoxi 在这个例子中,Person 就是一个构造函数,我们使用 new 创建了一个实例对象 person。 prototype 每个函数都有一个 prototype 属性,

C__Two的博客 243

WSL2+Ubuntu-22.04搭建PX4仿真环境:从零避坑到一键起飞

本文详细指导在Windows系统上通过WSL2和Ubuntu-22.04搭建PX4仿真开发环境的完整流程,涵盖环境配置、源码下载、依赖安装、Gazebo仿真及常见错误解决方案,帮助开发者从零避坑实现无人机一键起飞仿真。

k8s6orchestrator的博客 670

原型与原型链的底层理解

原型与原型链 1.什么是原型:原型就是prototype 对象有没有原型?我们来打印一下 原型是function函数特有的,对象,数组都没有 我们也举个栗子 2.原型链 既然函数有原型,那我们定义一个,再通过prototype往上面就可以加属性 再new一个person1对象,打印后发现 person1明明没有name却通过new关键字去继承Person的 3. 原型链的就近原则 接下来我们在person1上增加name属性,看打印的是什么 ...

小可桢的博客 309

FPGA实战:手把手教你用Verilog驱动4.3寸RGB触摸屏(附完整代码)

本文详细介绍了如何使用Verilog语言在FPGA上驱动4.3寸RGB触摸屏,包括时序设计、信号交互原理及完整代码实现。通过双计数器引擎设计和参数化模块,开发者可以高效构建800*480分辨率的显示驱动,并解决工程实践中的信号完整性和时序收敛问题。

rice5的博客 701

NVIDIA驱动装好了,Gazebo为啥还是卡?手把手教你用optirun搞定GPU加速

本文详细解析了NVIDIA驱动安装后Gazebo仍卡顿的原因,并提供三步精准诊断与GPU加速实战方案。通过optirun快速启用GPU加速,解决OpenGL与显示服务器的配置问题,显著提升仿真性能。适用于ROS、PX4等开发环境,帮助用户充分利用显卡性能。

weixin_30379531的博客 465

JS中原型、原型链的理解

1.构造函数 构造函数模式的目的就是为了创建一个自定义类,并且创建这个类的实例。构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立的,即实例识别。构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。 另外就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用。 function Person(name, age, gender) { //创建一个构造函数 this.name = name ...

qq_38867012的博客 3903

卷积码Viterbi译码算法原理及C语言实现

具体而言,卷积码的编码过程是将输入数据和编码器中的状态进行异或操作,输出码字为各个状态对应的结果。Viterbi译码算法是一种最大似然译码算法,根据接收到的含有噪声的码字,寻找出最有可能的原始数据序列。(2) 递推计算:根据接收到的码字和当前状态,计算下一时刻各个状态的路径度量,并记录每个状态的前驱状态。以上代码实现了一个简单的卷积码Viterbi译码算法,通过接收到的码字进行译码,并输出解码结果。(1) 初始化:将所有状态的路径度量初始化为一个很大的值,选择路径度量最小的状态作为起始状态。

2301_79331421的博客 826

JavaScript深入理解(10课)笔记-原型链和继承实现

Student.prototype = new Person() //这一句,要放在底下这一句的上面【放的顺序有讲究的】function Person() { } //【ES6 中的 class Person { } 是这边的语法糖】· 继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中);从我们上面的Object原型我们可以得出一个结论:原型链最顶层的原型对象就是Object的原型对象。__proto__ 这个属性不一定有的,本身就存在浏览器的兼容问题。

keke10的专栏 417

数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

本文介绍了连续图像和数字图像直方图匹配(直方图规定化)的原理、处理过程,并提供了案例进行了讲解。可以看到,直方图均衡处理是直方图匹配的一个重要桥梁。 最后,对于直方图规定化这个翻译个人觉得很low,个人感觉叫指定直方图更好理解,但Histogram Specification怎么翻译确实不太好把握,因此还是叫Histogram Matching直方图匹配最好。

老猿Python 2880

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【转】从 prototype.js 深入学习 javascript 的面向对象特性

从 prototype.js 深入学习 javascript 的面向对象特性 js是一门很强大的语言,灵活,方便。 目前我接触到的语言当中,从语法角度上讲,只有 Ruby 比它更爽。 不过我接触的动态语言只有: js ruby python flash的as 简单的几门, 应该算是井底之蛙之见。 js 语法成分简单,没有 ruby 语言复杂。所以有时候我觉得她更干净(Ruby F...

Hello world. 114

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【前端开发之JavaScript】(四)JS基础语法下篇:函数与对象核心要点深度解析

本文深入讲解JavaScript中函数与对象的核心概念。函数部分涵盖函数定义与调用、参数特性、函数表达式、作用域与作用域链;对象部分介绍三种创建方式、this关键字、JS与Java对象的区别。文章强调函数与对象的结合是JS编程的核心思维,通过将函数封装为对象方法实现代码结构化与复用。建议通过实践练习掌握这些基础知识,为后续学习DOM/BOM、框架等奠定基础。

2301_79248256的博客 2229

IEM模型,地表粗糙度模拟

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Javascript基础【完整版】

// 字面量声明// 数字对象方式声明//5

2301_80864686的博客 1337

JavaScript进阶

在 JavaScript 内置了一些构造函数,绝大部的数据处理都是基于这些构造函数实现的,JavaScript 基础阶段学习的 Date 就是内置的构造函数。标记清除算法将 “不再使用的对象” 定义为 “无法达到的对象”,就是从根部(在 JS 中就是全局对象)出发定时扫描内存中的对象。继承是面向对象编程的另一个特征,通过继承进一步提升代码封装的程度,JavaScript 中大多是借助原型对象实现继承的特性。基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将。

2201_76005738的博客 1069

深入理解 JavaScript 中的面向对象编程(OOP):从构造函数到原型继承

本文系统讲解JavaScript面向对象机制:从对象字面量到构造函数,再到原型模式、属性遮蔽、实例判断及组合继承。通过代码剖析hasOwnProperty、instanceof和__proto__的作用,并揭示ES6 class底层仍基于原型,帮助开发者真正掌握JS灵活而强大的OOP模型。

zjy_bjyxszd的博客 2070

原型和原型链笔记

一、原型的诞生: 实例属性可以复制,实例方法不可以复制,这个对属性来说没有什么问题,但是对于方法来说问题就很大了,因为方法都是在做完全一样的功能,但是却又两份复制,如果一个函数对象有上千和实例方法,那么它的每个实例都要保持一份上千个方法的复制,这显然是不科学的,这可肿么办呢,prototype应运而生。 - 二、原型是什么: 基本概念 在面向对象编程中除了一些库函数我们还是希望在对象定义的时...

JankoY的博客 189

Javascript原型链与构造函数

文章目录1. JavaScript对象2. 原型链3. 构造函数 1. JavaScript对象 JavaScript是面向对象的,但并没有类的概念,后续版本增加的,但实际上还是依赖原型来实现的(语法糖)。 面向对象的三大特征:封装、继承、多态。多态的体现就是继承, js的基石–ECMAScript中对象(Obeject)的定义: Object是一个属性的集合,并且都拥有一个单独的原型对象[p...

qq_40483271的博客 352

JavaScript之继承

1 面向对象编程思想:根据需求,分析对象,找到对象有什么特征和行为,通过代码的方式来实现需求,要想实现这个需求,就要创建对象,要想创建对象,就应该显示有构造函数,然后通过构造函数来创建对象.,通过对象调用属性和方法来实现相应的功能及需求,即可 2 JS不是一门面向对象的语言,JS是一门基于对象的语言 3 面向对象的编程语言中有类(class)的概念(也是一种特殊的数据类型),但是JS不是面向对...

qq_41320857的博客 188

前端basic:js篇

本文总结了JavaScript环境准备和核心知识要点。环境部分介绍了Node.js安装、运行JS代码的方法及VS Code插件使用。知识要点包括:1. 数据表达的三种方式(变量、字面量、表达式)及标识符命名规则;2. 对象和数组的数据结构及属性访问方法;3. 各类运算符的使用技巧和隐式类型转换;4. 函数的作用、三要素(函数名、参数、返回值)及流程切割思想;5. 作用域规则和闭包概念;6. 全局对象特性及全局污染问题。全文重点突出了实际开发中的最佳实践和简化代码的技巧。

sanlyshi's front-end road 245

JavaScript 原型与原型链

JavaScript 中的原型(Prototype)和原型链(Prototype Chain)是其核心特性之一,理解它们对于掌握 JS 的继承机制、对象属性查找以及代码复用至关重要。

chanyeol14805的博客 1909

HoRain云--JavaScript prototype(原型对象)

每个 JavaScript 对象都有一个与之关联的原型对象,通过原型对象,可以实现属性和方法的共享,从而减少内存占用。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。在上面的例子中,obj 对象没有定义 toString 方法,因此 JavaScript 沿着原型链查找,最终在 Object.prototype 中找到该方法。

sinat_57153473的博客 193
上一篇: 状态管理之 Flux、Redux、Vuex、MobX(概念篇)
下一篇: Java对象为啥要实现Serializable接口?
妄想编程
博客等级 码龄8年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值