【原型链】JS中的原型链到底是什么
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,仍未找到,则会返回错误。也就是说,对象会继承其原型对象的属性
总结
- 对象都有构造函数,或是默认构造函数,或是自己写的构造函数
- 实例对象的__proto__属性指向其原型对象,constructor属性指向构造函数
- 构造函数的prototype属性指向原型对象,原型对象的constructor属性指向构造函数
- 实例对象->原型对象->原型对象的原型对象->…->null组成了原型链,对象会继承原型链上所有原型对象的属性
- 查找某一对象的某一属性时,若该对象自身没有该属性则会顺着原型链往上找,直到原型链的末尾
【原型链】JS中的原型链到底是什么相关推荐
- JS原型理解——JS中的原型对象
JavaScript中的原型对象 下一篇:JS原型理解--JS继承的实现方式 原型 原型是JavaScript中继承的基础,JavaScript的继承就是基于原型的继承. 一 理解原型 1.1 函数的 ...
- js原型和原型链_理解JS中的原型和原型链
导读:JavaScript中(JS)的原型和原型链是web前端开发面试中经常被问到的问题:同时,如果我们能很好的理解JS中的原型和原型链,对于控制台输出的很多信息我们也能更好的理解,而原型链也是实现继 ...
- JS中的原型和原型链(图解)
JS中的原型和原型链 讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个' ...
- js中数组原型Array、自定义原型函数Array.prototype
全栈工程师开发手册 (作者:栾鹏) js系列教程1-数组操作全解 js中数组原型.自定义原型函数 每个数组都包含length.prototype.constructor属性. 通过在prototype ...
- 详解JS中的原型与继承
每当我们提起原型链时不免会想到原型对象,对象的原型,还有众多的继承方式.于是prototype.[[prototype]].constructor等等难免在头脑中打架. 然而原型其实并不是什么高大上的 ...
- 详解 JS 中 a.x = a = {} 到底发生了啥?(图文并茂,包你看懂)
直奔主题,先贴上代码: let a = {n:1}a.x = a = {n:2}console.log(a.x) console.log(a.x) 输出什么呢? 作为一个初学者,我的第一反应还是挺懵的 ...
- JS中的原型链(超清晰理解)
什么是原型链 原型链,所有的原型构成了一个链条,这个链条我们称之为原型链(prototype chain). 原型链的案例 如果我们执行下面这段代码,因为没有定义address这个属性,程序结果理所当 ...
- 如何更加简单的理解JS中的原型原型链概念
前面写了很多关于前端经验之谈,今天就来点干货吧.这篇文章将会介绍原型这个概念 原型是整个Javascript中比较重要的概念,如果面向对象想要学好,那么这个东西你必须要了解,不然后面的原型链,继承,多 ...
- js中的原型与原型链
1.什么是原型? 每一个对象都有他的原型对象,他可以使用自己原型对象上的所有属性和方法. 2.什么是原型链? 在JavaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链 ...
最新文章
- WCF 接收我服务的 HTTP 响应时发生错误
- labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
- java 方法注解_使用Java注解不正确的方法
- python实例属性与类属性_Python类属性与实例属性用法分析
- linux c设置系统时间函数,Linux C 中获取local日期和时间 time()localtime()函数
- 【Vue】样式穿透 ::v-deep的具体使用
- MP3免费音频文件下载
- 《DirectX 9.0 3D游戏开发编程基础》-第一篇-VS2010下安装配置DirectX9 runtime和SDK
- 什么是BIM,什么是CIM?
- mirrorlink
- HTML颜色名称和颜色代码表
- Internal Server Error, Malformed UTF-8 characters, possibly incorrectly encoded
- 招银网络科技2019年春招笔试面试总结
- 什么是计算机软件 软件定义,软件定义_软件定义教程_软件定义视频教程 _课课家...
- 关于cmd打开时提示“系统找不到指定的路径”问题
- Hadoophbase监控页面未授权访问漏洞处理方案验证过程实现
- PDPS15(Tecnomatix_15.0)安装包及安装教程分享
- PHAS0020 Final Assignment
- JAVA docx/doc转html代码
- 无效的合同可以被追认吗