1.构造函数

JS中的构造函数和普通函数没有本质区别,要用调用方式的不同来区分。

在调用构造函数时要用new Func()的方法来调用,此时函数会默认返回this

为了与普通函数区分,构造函数的函数名一般以大写字母开头。

function Person(name,age){this.name=name;this.age=age
}
var xiaoming=Person('xiaoming',20);//错误调用,xiaoming为undefined
var xiaoming=new Person('xiaoming',20)//正确调用,xiaoming是一个对象
xiaoming.constructor===Person//true

注意,任何对象都有构造函数,直接用大括号声明的对象其构造函数就是Object

var a={name: 'obj'
}
a.constructor===Object//true

通过一个构造函数,我们就可以创造出很多不同的对象,有时这些对象需要公共的方法,最简单的方式是将方法直接放在构造函数中,但这样会造成内存的浪费:

function Person(name,age){this.name=name;this.age=age;this.sayhi=function(){console.log("hi,I'm "+this.name);}
}
var xiaoming=new Person('xiaoming',20);
var xiaogang=new Person('xiaogang',20);
xiaoming.sayhi===xiaogang.sayhi//false,两个对象的公共函数不是用的同一份代码

2.原型对象

什么是原型对象?

JS中的所有对象,不管是用构造函数的方法创建的,还是直接用大括号创建的

都有一个_proto_ 属性指向它的原型对象,该原型对象有一个constructor属性指向它的实例对象的构造函数

有一个constructor属性指向它的构造函数,该构造函数有一个prototype属性指向它的原型对象

有点绕,画成图就是这个样子,从图中可以看出上面所说的各个属性的取值

再用代码来表示

function Person(name,age){this.name=name;this.age=age
}
var xiaoming=new Person('xiaoming',20)//
xiaoming.constructor===Person
//true,实例对象的constructor属性指向构造函数Person===xiaoming.__proto__.constructor
//true,原型对象的constructor属性指向构造函数xiaoming.__proto__===Person.prototyp;
//true,构造函数的prototype属性和实例对象的__proto__属性都只想原型对象var xiaohong=new Person('xiaohong',20)
xiaohong.__proto__===xiaoming.__proto__;
//true,不同实例对象的原型对象是同一个

由此得出,xiaoming.__proto__属性和Person.prototype属性所指向的,就是由构造函数Person创建出的所有对象所共有的原型对象,那么只要将公共方法作为这个原型对象的方法,就可以实现一个方法供不同的实例对象调用

Person.prototype.sayHi=function(){console.log("Hi,I'm "+this.name);
}
xiaoming.sayHi()//Hi,I'm xiaoming
xiaohong.sayHi()//Hi,I'm xiaohong
xiaoming.sayHi===xiaohong.sayHi///true,是同一个函数

3.原型链

现在我们知道,xiaoming的_proto_属性指向它的原型对象,而事实上,它的原型对象也有_proto__属性,指向它的原型对象

xiaoming.__proto__.__proto__//Object
xiaoming.__proto__.__proto__.__proto__//null
xiaoming.__proto__.__proto__.__proto__.__proto__//出错,null没有原型对象,也就没有__proto__属性

像这样,一个个的对象和原型对象串在一起,以实例对象为起点,以没有原型对象的null为终点,就组成了原型链。

上面我们将sayHi方法绑定到xiaoming的原型对象上,并且对象xiaoming可以调用该函数,那么是不是说sayHi是xiaoming自身的属性呢?我们用hasOwnProperty()方法来检验一下

xiaoming.hasOwnProperty('sayHi')//false
xiaoming.hasOwnProperty('sayhi')//true

可见,在构造函数内定义的函数sayhi是xiaoming自身的属性,而定义在原型对象上的函数sayHi则不是,那么为什么xiaoming可以调用该方法呢?

这是因为在JS中,调用一个对象的属性时,如果该对象自身没有这个属性,那么就会自动在它的原型对象上找,若还没有则顺着原型链往上找,若直到某一原型对象的原型对象为null,仍未找到,则会返回错误。也就是说,对象会继承其原型对象的属性

总结

  1. 对象都有构造函数,或是默认构造函数,或是自己写的构造函数
  2. 实例对象的__proto__属性指向其原型对象,constructor属性指向构造函数
  3. 构造函数的prototype属性指向原型对象,原型对象的constructor属性指向构造函数
  4. 实例对象->原型对象->原型对象的原型对象->…->null组成了原型链,对象会继承原型链上所有原型对象的属性
  5. 查找某一对象的某一属性时,若该对象自身没有该属性则会顺着原型链往上找,直到原型链的末尾

【原型链】JS中的原型链到底是什么相关推荐

  1. JS原型理解——JS中的原型对象

    JavaScript中的原型对象 下一篇:JS原型理解--JS继承的实现方式 原型 原型是JavaScript中继承的基础,JavaScript的继承就是基于原型的继承. 一 理解原型 1.1 函数的 ...

  2. js原型和原型链_理解JS中的原型和原型链

    导读:JavaScript中(JS)的原型和原型链是web前端开发面试中经常被问到的问题:同时,如果我们能很好的理解JS中的原型和原型链,对于控制台输出的很多信息我们也能更好的理解,而原型链也是实现继 ...

  3. JS中的原型和原型链(图解)

    JS中的原型和原型链 讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个' ...

  4. js中数组原型Array、自定义原型函数Array.prototype

    全栈工程师开发手册 (作者:栾鹏) js系列教程1-数组操作全解 js中数组原型.自定义原型函数 每个数组都包含length.prototype.constructor属性. 通过在prototype ...

  5. 详解JS中的原型与继承

    每当我们提起原型链时不免会想到原型对象,对象的原型,还有众多的继承方式.于是prototype.[[prototype]].constructor等等难免在头脑中打架. 然而原型其实并不是什么高大上的 ...

  6. 详解 JS 中 a.x = a = {} 到底发生了啥?(图文并茂,包你看懂)

    直奔主题,先贴上代码: let a = {n:1}a.x = a = {n:2}console.log(a.x) console.log(a.x) 输出什么呢? 作为一个初学者,我的第一反应还是挺懵的 ...

  7. JS中的原型链(超清晰理解)

    什么是原型链 原型链,所有的原型构成了一个链条,这个链条我们称之为原型链(prototype chain). 原型链的案例 如果我们执行下面这段代码,因为没有定义address这个属性,程序结果理所当 ...

  8. 如何更加简单的理解JS中的原型原型链概念

    前面写了很多关于前端经验之谈,今天就来点干货吧.这篇文章将会介绍原型这个概念 原型是整个Javascript中比较重要的概念,如果面向对象想要学好,那么这个东西你必须要了解,不然后面的原型链,继承,多 ...

  9. js中的原型与原型链

    1.什么是原型? 每一个对象都有他的原型对象,他可以使用自己原型对象上的所有属性和方法. 2.什么是原型链? 在JavaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链 ...

最新文章

  1. WCF 接收我服务的 HTTP 响应时发生错误
  2. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  3. java 方法注解_使用Java注解不正确的方法
  4. python实例属性与类属性_Python类属性与实例属性用法分析
  5. linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数
  6. 【Vue】样式穿透 ::v-deep的具体使用
  7. MP3免费音频文件下载
  8. 《DirectX 9.0 3D游戏开发编程基础》-第一篇-VS2010下安装配置DirectX9 runtime和SDK
  9. 什么是BIM,什么是CIM?
  10. mirrorlink
  11. HTML颜色名称和颜色代码表
  12. Internal Server Error, Malformed UTF-8 characters, possibly incorrectly encoded
  13. 招银网络科技2019年春招笔试面试总结
  14. 什么是计算机软件 软件定义,软件定义_软件定义教程_软件定义视频教程 _课课家...
  15. 关于cmd打开时提示“系统找不到指定的路径”问题
  16. Hadoophbase监控页面未授权访问漏洞处理方案验证过程实现
  17. PDPS15(Tecnomatix_15.0)安装包及安装教程分享
  18. PHAS0020 Final Assignment
  19. JAVA docx/doc转html代码
  20. 无效的合同可以被追认吗

热门文章

  1. miRDeep2 学习及安装篇
  2. 路由虚拟化之梦--准备
  3. Python 介绍及相关资料
  4. 模糊+滑膜轨迹跟踪控制算法 算法可实现功能:跟踪双移线,单移线,多项式曲线等多种轨迹,稳定性和较好
  5. 【excel VBA】中英文分割
  6. [易飞]影响成本码含义与运用
  7. [ 漏洞挖掘基础篇六 ] 漏洞挖掘之越权漏洞挖掘
  8. js复制内容到剪贴板代码,js复制代码
  9. Anaconda创建虚拟环境
  10. 快鲸SCRM打通工单系统,实现客户售前售后一体化管理