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原型及原型链解析的更多相关文章

  1. Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法

    对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es ...

  2. js通过沿着作用域链还是原型链查找变量

    这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...

  3. JS基础-该如何理解原型、原型链?

    JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...

  4. 攻略前端面试官(三):JS的原型和原型链

    本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...

  5. 原型链污染(Node.js污染,javasrcipt原型链污染的)

    学习链接: https://www.jianshu.com/p/6e623e9debe3 关于NJS  https://xz.aliyun.com/t/7184 相关题是 GYCTF  ez_expr ...

  6. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  7. 【repost】JS原型与原型链终极详解

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

  8. JS原型与原型链终极详解

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

  9. JS原型与原型链终极详解(转)

    JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...

随机推荐

  1. PHP set_error_handler()函数的使用

    我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置.行数和原因.有很多人说,这并没有什么大不了.确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必 ...

  2. CF77E Martian Food(圆的反演or 笛卡尔定理+韦达定理)

    题面 传送门 这题有两种方法(然而两种我都想不到) 方法一 前置芝士 笛卡尔定理 我们定义一个圆的曲率为\(k=\pm {1\over r}\),其中\(r\)是圆的半径 若在平面上有两两相切,且六个 ...

  3. centos启动错误:Inodes that were part of a corrupted orphan linked list found.

    centos启动时,提示错误: /dev/mapper/VolGroup-lv_root contains a file system with errors,check forced. /dev/m ...

  4. js继承(自备水,这非常干货)

    讲js继承之前,想一想什么是继承? 生活中有很多例子,比方说继承财产,继承女朋友的前男友的前女友 ヽ(ー_ー)ノ ,这些和js继承差不多,但是有一个不一样的地方,就是继承过后,原先的人就没有了,js继 ...

  5. [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】

    Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...

  6. springcloud(七)-Feign声明式REST调用

    前言 前面我们使用的RestTemplate实现REST API调用,代码大致如下: public User findById(@PathVariable Long id) { return rest ...

  7. 安装CentOS 7.4时服务器出现No Caching mode page found问题的解决方法

    2019-03-27 前提准备条件: 操作系统:centos 7.4:服务器使用U盘安装,U盘使用UltraISO制作启动盘 安装过程出现的问题: [sdb] No Caching mode page ...

  8. Sql语句里的递归查询 SqlServer2005和Oracle 两个版本

    以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:SqlServer2005版本的Sql如下:比如一个表,有id和pId字段,id是 ...

  9. window.name实现跨域

    在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 这篇文章中,我提到了几种跨域的方式,这里主要讲解使用window.name实现跨域. 跨域就 ...

  10. mssql 注入

    注入查阅 .返回的是连接的数据库名 .作用是获取连接用户名 .将数据库备份到Web目录下面 ;backup database 数据库名 to disk='c:\inetpub\wwwroot\1.db ...