js原型及原型链解析
js原型、原型链
这几天闲了看了下js的原型,以下内容为个人理解,如有错误,尽请指正。
首先,明确一点:js中的对象分为普通对象和函数对象,一般我们自定义的可以被new的函数称作函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、Boolean、RegExp、Error等这些函数对象:

1、只有函数对象才有prototype属性,该属性指向的俗称“原型”或者“原型对象”,举个栗子:
function Person() {}
console.log(Person.prototype) // {constructor: Person, __proto__: Object}
2、每个原型或者原型对象还有一个constructor属性,即上面的Person.prototype.constructor,该属性指向该函数的构造,这里指向Person自身,即:
Person.prototype.constructor === Person // true
3、所有对象,不论普通对象还是函数对象都有一个__proto__属性,该属性指向其构造的原型,使用__proto__将所有对象联系起来,才形成了所谓的原型链,举个栗子:
function Person() {}
const p1 = new Person()
console.log(p1.__proto__ === Person.prototype) // true, p1是由Person构造的
console.log(Person.prototype.__proto__ === Object.prototype) // true, Person的原型是由Object构造的,因为Person.prototype是一个普通对象,普通对象的构造都是Object
console.log(Person.__proto__ === Function.prototype) // true, Person是由Function构造的
console.log(Function.__proto__ === Function.prototype) // true, Function是由自身构造的
console.log(Function.prototype.__proto__ === Object.prototype) // true, Function的原型是由Object构造的
console.log(Object.__proto__ === Function.prototype) // true, Object是由Function构造的,类似Person.__proto__
console.log(Date.__proto__ === Function.prototype) // true, Date是由Function构造的,类似Person.__proto__
console.log(String.__proto__ === Function.prototype) // true, String是由Function构造的,类似Person.__proto__
console.log(Boolean.__proto__ === Function.prototype) // true,Boolean是由Function构造的,类似Person.__proto__
console.log(Object.prototype.__proto__ === null) // true, Object的原型是由null"产生"的,null处于原型链顶端
这个从根本上印证了道德经那句:道(null)生一,一生二,二生三,三生万物。无,名天地之始。
4、一般我们通过.操作符获取一个对象的属性或方法的时候,会首先在当前对象自身上查找该属性或方法,找不到的话会继续顺着__proto__也就是原型链向上查找,直到找到,否则返回undefined,举个栗子:
function Person() {
this.name = 'Nicholas'
this.age = 29
this.job = 'Software Engineer'
this.sayName = function() {
console.log(this.name)
}
}
const person1 = new Person()
const person2 = new Person()
person1.sayName()
person2.sayName()

[[Prototype]]即上面所说的_proto_,由上图可以直接得出如下结论:
Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;
当我们获取person1.age时,发现person1自身并无age属性,所以会自动向上查找person1.proto.age,发现有并为29,则直接返回29,即person1.age === 29
function Person() {
this.name = 'Nicholas'
this.age = 29
this.job = 'Software Engineer'
this.sayName = function() {
console.log(this.name)
}
}
const person1 = new Person()
console.log(person1.age === 29) // true
同理,查找person1.constructor时会自动查找到Person自身,所以如下是恒等的:
function Person(name) {
this.name = name
}
var p = new Person('jack')
console.log(p.__proto__ === p.constructor.prototype) // true
下一节的话讲下js中的继承~
js原型及原型链解析的更多相关文章
- Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法
对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es ...
- js通过沿着作用域链还是原型链查找变量
这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- 攻略前端面试官(三):JS的原型和原型链
本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...
- 原型链污染(Node.js污染,javasrcipt原型链污染的)
学习链接: https://www.jianshu.com/p/6e623e9debe3 关于NJS https://xz.aliyun.com/t/7184 相关题是 GYCTF ez_expr ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- 【repost】JS原型与原型链终极详解
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...
- JS原型与原型链终极详解
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...
- JS原型与原型链终极详解(转)
JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...
随机推荐
- C博客第01次作业---顺序,分支结构
1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 经过了这一周的学习,从一开始对C语言一无所知,到现在能够写出基本的代码,感到非常开心. 学习C语言也并非想象 ...
- 自注意力机制(Self-attention Mechanism)——自然语言处理(NLP)
近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中.随着注意力机制的深入研究,各式各样的attention被研究者们提出.在2017年6月google机 ...
- eclipse的debug模式经常自动跳到TheadPoolExecutor的断点
1.问题:eclipse的debug模式经常自动跳到TheadPoolExecutor的断点,实在烦人 解决方法是: 在eclipse中选择Window->Preference->Java ...
- Github 升级到 Rails 5.2.1 了
简评:之前用的可是 3.2,早就该升级了啊. Github 的 Rails 升级花了大约一年半的时间,这是有原因的,首先,Rails 本身的升级并不总是平滑的,有些版本有重大改变(breaking c ...
- Python 的 GIL 是什么鬼,多线程性能究竟如何
作者:卢钧轶(cenalulu) 本文原文地址: http://cenalulu.github.io/python/gil-in-python/ 前言:博主在刚接触Python的时候时常听到GIL这个 ...
- python-requests库的使用之爬取贴吧内容并保存在本地
以面向对象的程序设计方式,编写爬虫代码爬去‘李毅吧’所有页面的内容,也可以通过改变对象的参数来爬取其它贴吧页面的内容. 所用到的库为:requests 涉及知识点:python面向对象编程,字符串操作 ...
- js 封装trim()方法,去掉空格
<script> //定义一个对象 - 名字是$ var $$ = function() {}; //原型 $$.prototype = { $id:function(id) { retu ...
- knova绘制矩形
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Eclipse 的SVN 的分支
分支 概念 在版本控制过程中,使用多个分支同时推进多个不同功能开发. 不使用分支开发:人与人之间协作 使用分支开发:小组和小组之间协作 作用 多个功能开发齐头并进同时进行 任何一个分支上功能 ...
- Git、Github、码云 笔记汇总
从本地恢复码云的项目 把本地项目同步到码云 CBoard 基于0.4.1的旧版本的分支修改合并到0.4.2新版本里面 通过git命令行把一个分支的其中一个commit(提交)合并到另外一个分支里面去