Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【前端基础进阶】JS原型、原型链、对象详解

【前端基础进阶】JS原型、原型链、对象详解

作者头像
super.x
发布于 2019-04-12 07:20:47
发布于 2019-04-12 07:20:47
8990
举报

一. 普通对象与函数对象

JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明

代码语言:javascript
AI代码解释
复制
var o1 = {}; 
var o2 =new Object();
var o3 = new f1();

function f1(){}; 
var f2 = function(){};
var f3 = new Function('str','console.log(str)');

console.log(typeof Object); //function 
console.log(typeof Function); //function  

console.log(typeof f1); //function 
console.log(typeof f2); //function 
console.log(typeof f3); //function   

console.log(typeof o1); //object 
console.log(typeof o2); //object 
console.log(typeof o3); //object

在上面的例子中 o1 o2 o3 为普通对象, f1 f2 f3 为函数对象。 怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。 f1,f2,归根结底都是通过 new Function()的方式进行创建的。

Function Object 也都是通过 New Function()创建的。

二. 构造函数

我们先复习一下构造函数的知识:

代码语言:javascript
AI代码解释
复制
function Person(name, age, job) {
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function() { alert(this.name) } 
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');

上面的例子中 person1 和 person2 都是 Person 的实例。这两个实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person。 即:

代码语言:javascript
AI代码解释
复制
  console.log(person1.constructor == Person); //true
  console.log(person2.constructor == Person); //true

我们要记住两个概念(构造函数,实例):

person1 和 person2 都是 构造函数 Person 的实例

一个公式:

实例的构造函数属性(constructor)指向构造函数。

三. 原型对象

在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。

代码语言:javascript
AI代码解释
复制
function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age  = 28;
Person.prototype.job  = 'Software Engineer';
Person.prototype.sayName = function() {
  alert(this.name);
}
  
var person1 = new Person();
person1.sayName(); // 'Zaxlct'

var person2 = new Person();
person2.sayName(); // 'Zaxlct'

console.log(person1.sayName == person2.sayName); //true

我们得到了本文第「定律」:

1.每个对象都具有一个名为__proto__的属性;2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性); 3.每个对象的__proto__属性指向自身构造函数的prototype; 4.每个对象都有 、__proto__ 属性,但只有函数对象才有 prototype 属性

四. 原型链

五、原型链 原型对象其实也是普通的对象。几乎所有的对象都可能是原型对象,也可能是实例对象,而且还可以同时是原型对象与实例对象。这样的一个对象,正是构成原型链的一个节点。因此理解了原型,那么原型链并不是一个多么复杂的概念。 我们知道所有的函数都有一个叫做toString的方法。那么这个方法到底是在哪里的呢? 先随意声明一个函数:

代码语言:javascript
AI代码解释
复制
function add() {}

那么我们可以用如下的图来表示这个函数的原型链。

原型链

其中add是Function对象的实例。而Function的原型对象同时又是Object原型的实例。这样就构成了一条原型链。原型链的访问,其实跟作用域链有很大的相似之处,他们都是一次单向的查找过程。因此实例对象能够通过原型链,访问到处于原型链上对象的所有属性与方法。这也是foo最终能够访问到处于Object原型对象上的toString方法的原因。 基于原型链的特性,我们可以很轻松的实现继承。


具体基本知识了解后,我们分析下图

第一

先从实例add()分析 实例add() 为 Function的实例 所以 add()的__proto__指向其构造函数的原型即 Function.prototype

代码语言:javascript
AI代码解释
复制
var add = function () {}
add.__proto__ === Function.prototype//true

特别注意 构造函数Funciton的__proto__指向自身的Function.prototype

代码语言:javascript
AI代码解释
复制
Function.__proto__ === Function.prototype//true

所以构造函数Function的__proto__和prototype都指向Function.prototype

第二

因为Function和Object都是js自带函数 且 Object 也是由 new Function创建而来

代码语言:javascript
AI代码解释
复制
typeof Function
"function"
typeof Object
"function"

所以 Object的__proto__指向Function的原型对象即 Function.prototype

代码语言:javascript
AI代码解释
复制
Object.__proto__ === Function.prototype
true

因此 Object 的 prototype 和 Function.prototype的 __proto__都指向 Object.prototype

第三

Object.prototype被称为原型链的E端,因为它的__proto__为null

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第202天:js---原型与原型链终极详解
JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明
半指温柔乐
2018/09/11
1.1K0
第202天:js---原型与原型链终极详解
【JS】479- 又见原型和原型链
在前端这块领域,原型与原型链是每一个前端er必须掌握的概念。我们多次在面试或者一些技术博客里面看见这个概念。由此可见,这个玩意对于前端来说有多重要。其实它本身理解起来不难,但是很多刚入行前端的同学,看到prototype、__proto__理解起来还是有点吃力,然后脑子里面就乱成一锅粥,就像我一样。但是这是很正常的事情,没什么大不了的,就像我们想要学会跑步,那么我们就必须先学会走路。任何事情都是有个过程的。所以现在就跟我一起来攻克这个难点吧。通过这篇文章你将掌握以下知识点:
pingan8787
2020/02/17
7610
原型和原型链的深入浅出
对象是 javascript 基本数据类型。对象是一种复合值: 它将很多值(原始值或者其它对象)聚合在一起,可通过名字访问这些值。
前端老鸟
2022/03/07
5370
原型与原型链
网上有太多关于原型的资料,不是一上来就各种概念,让人看到摸不着头脑,就是贴各种代码,少个通俗的解释,所以才有了这一篇文章。
前端程序之路
2021/03/28
7150
原型与原型链
ES5面向对象基础
面向对象的知识时JS中的一个比较重要的概念,我们今天学习一下ES5面向对象的基础内容。
kai666666
2020/10/17
7340
【前端芝士树】Javascript的原型与原型链
1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,但是刚开始的Js没有继承机制,更别提像同时期兴盛的C++和Java这样拥有面向对象的概念。在实际的开发过程中,工程师们发现没有继承机制很难解决一些问题,必须有一种机制能将所有的对象关联起来。
CloudCat
2022/05/06
3200
【前端芝士树】Javascript的原型与原型链
一张图带你搞懂Javascript原型链关系
为了更好的图文对照,我为每条线编了标号,接下来的细节讲解,都会用到这张图里的编号:
xing.org1^
2021/08/10
1.2K0
JS面试必问-JS原型及原型链
在js中万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。
用户10106350
2022/10/26
2K0
JS面试必问-JS原型及原型链
JavaScript学习总结(四)——this、原型链、javascript面向对象
根据题目要求,对给定的文章进行摘要总结。
张果
2018/01/04
1.6K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
吊打前端专栏 | 吊打JavaScript之从原型到原型链
每个函数都有一个 prototype 原型属性,这个属性它是一个指针,指向一个对象,而这个对象的用途是可以由特定类型的所有实例共享的属性和方法。则这个 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象。
达达前端
2022/04/13
4270
吊打前端专栏 | 吊打JavaScript之从原型到原型链
详解原型与原型链
其实,刚开始学 JavaScript 时,就有学过原型与原型链的相关知识了,只是当时还没有养成写笔记的习惯,导致现在已经忘的七七八八了。
赤蓝紫
2023/01/02
5170
详解原型与原型链
彻底弄懂JS原型与原型链
说到JavaScript的原型和原型链,相关文章已有不少,但是大都晦涩难懂。本文将换一个角度出发,先理解原型和原型链是什么,有什么作用,再去分析那些令人头疼的关系。
hellocoder2029
2022/12/07
1.4K0
一文彻底搞懂原型链
js分为「函数对象」和「普通对象」,每个对象都有__proto__属性,但是只有函数对象且「非箭头函数」才有prototype属性。
PHP开发工程师
2022/03/12
1.8K0
一文彻底搞懂原型链
一文带你彻底搞懂JavaScript原型链
Brendan Eich(布兰登·艾奇) 作为JavaScript的作者曾说过 “它是C语言和Self语言一夜情的产物。”
童欧巴
2020/03/30
5340
一文带你彻底搞懂JavaScript原型链
再谈javascriptjs原型与原型链及继承相关问题
普通的内置对象与基本包装类型的主要区别就是对象的生命期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只是存在于一行代码的执行瞬间,然后立即被立即销毁。这意味着我们不能再运行时为基本包装类型值添加属性和方法。
IMWeb前端团队
2019/12/04
6260
js原型和原型链
每个函数都有一个 prototype 属性 每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型对象prototype ,每一个对象都会从原型对象上"继承"属性。
hss
2022/02/25
2.4K0
js原型和原型链
第186天:js深入理解构造函数和原型对象
1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例。但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propotype chains)实现的。但在ES6中引入了类(class)这个概念,作为对象的模板,新的class写法知识让原型对象的写法更加清晰,这里不重点谈这个
半指温柔乐
2018/09/11
8070
第186天:js深入理解构造函数和原型对象
js原型及原型链解析
首先,明确一点:js中的对象分为普通对象和函数对象,一般我们自定义的可以被new的函数称作函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、Boolean、RegExp、Error等这些函数对象:
用户1141560
2019/05/24
2.6K0
Javascript之其实我觉得原型链没有难的那么夸张!
  原型链、闭包、事件循环等,可以说是js中比较复杂的知识了,复杂的不是因为它的概念,而是因为它们本身都涉及到很多的知识体系。所以很难串联起来,有一个完整的思路。我最近想把js中有点意思的知识都总结整理一下,虽然逃不开一些一模一样的内容,但是自己造一下轮子,按照自己的思路。也别有一番味道。
zaking
2020/08/19
8770
一篇JavaScript技术栈带你了解继承和原型链
在学习JavaScript中,我们知道它是一种灵活的语言,具有面向对象,函数式风格的编程模式,面向对象具有两点要记住,三大特性,六大原则。
达达前端
2019/11/19
5380
相关推荐
第202天:js---原型与原型链终极详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场