_proto_ && prototype (原型 && 原型链)
原型一直都是JavaScript基础里面的痛点,因为在JavaScript里面没有类的概念,都是通过原型对象来实现继承,下面的这个图很好的说明几者之间的关系!
a.__proto__ = A.prototype;
Function.prototype.constructor = Function
一, 什么是_proto_?
JavaScript里面万物皆对象,每个对象都有一个内置属性[[prototype]大多数浏览器都通过proto来访问,ES5对于这个内置属性标准的get方法Object.getPrototypeOf()
二, prototype与__proto__的区别
每个对象都有__proto__属性,一般将__proto__ 称之为隐示原型,其作用是构成原型链,同样实现基于原型的继承;prototype是函数对象特有的属性,prototype称之为显示原型,每个function在创建之后,都会有一个prototype属性,这个属性指向函数的原型对象;其主要作用是实现了基于原型的继承和属性的共享
var a = {}
console.log(a. __proto__) 返回 object
console.log(a. prototype) 返回undefined
var b = function () {}
console.log(b. __proto__) 返回 object
console.log(b. prototype) 返回 原型对象
三,原型链
当查找一个对象的属性时,JavaScript会先从当前对象身上查找是否有此属性,如果没有的话,就从原型身上查找,而原型对象身上还有原型,如同递归一样,
直到找到给定属性的名称为止,到查找到原型链的顶部,也就是Object.prototype,如果仍然还没找到的话,就返回undefined,这一系列过程就被称之为原型链__proto__实现方法继承和属性共享实例:
var Base = function (){
this.name = ‘good’
}
Base.prototype = {
add: function (x,y) {
return x+y
},
square: function (x) {
return x*x
}
}
var Result = function () {
this.age = 12
}
Result.prototype = new Base()
var test = new Result();
document.write(test.add(3,5)) // 返回 8
document.write(test.name) // 返回 good
document.write(test.sex) // 返回undefined
__ptoto__原型链分析:
(1)test实例对象本身没有name属性,所以就从test.__proto__原型身上查找name属性
(2)test实例对象属性和方法继承自 Result
console.log(test.__proto__ === Result.prototype) // 返回true
(3)Result对象继承自 Base
console.log(Result.prototype.__proto__ === Base.prototype). // 返回true
(4)此时 Base对象身上有属性name ,所以返回 'good'
(5)Base 对象继承自 Object
console.log(Base.prototype.__proto__ === Object.prototype). // 返回true
四,_proto_的指向问题
_proto_指向创建这个对象的函数的显示原型,也就是创建这个对象的构造函数的原型,在JavaScript创建对象的三种方式
(1)对象字面量的方式
var a = {}
console.log(a.__proto__). // 返回 object
console.log(a.__proro__ === a.constructor.prototpye). 返回true (2)new 方式(构造器的方式)
var A = function () {}
var b = new A ()
console.log(a.__proto__). // 返回 构造函数A
console.log(a.__proto__ === A.prototype). //返回 true (3) Object.create() /ES5的创建对象方法/
var a = {a1:1}
var b =Object.create(a)
console.log(b.__proto__)
console.log(b.__proto__ === a.constructor.prototype)
疑问:Object.create() 创造的对象没有构造函数,疑问的是对象的__proto__指向哪里?
五,ES5里的hasOwnProperty函数
hasOwnProperty是Object.property的方法,它可以判断一个对象是否包含自定义属性还是原型链属性,具体实例如下:
Object.prototype.bar = 1;
foo = {'god':null}
console.log(foo.bar). // 返回1
console.log('bar' in foo) // 返回true
console.log(foo.hasOwnProperty('bar')). 返回false
console.log(foo.hasOwnProperty('god')). 返回true
_proto_ && prototype (原型 && 原型链)的更多相关文章
- 原型prototype、原型链__proto__、构造器constructor
创建函数时,会有原型prototype,有原型链__proto__,有constructor.(构造函数除外,没有原型) . prototype原型:是对象的一个属性(也是对象),使你有能力向对象添加 ...
- [js高手之路]一步步图解javascript的原型(prototype)对象,原型链
我们接着上文继续,我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) { this ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- JavaScript的原型对象prototype、原型属性__proto__、原型链和constructor
先画上一个关系图: 1. 什么是prototype.__proto__.constructor? var arr = new Array; 1. __proto__是原型属性,对象特有的属性,是对象指 ...
- 全面了解 Javascript Prototype Chain 原型链
原型链可以说是Javascript的核心特征之一,当然也是难点之一.学过其它面向对象的编程语言后再学习Javascript多少会感到有些迷惑.虽然Javascript也可以说是面向对象的语言,但是其实 ...
- js中的原型对象链
由于原型对象也是一个对象,它也有自己的原型对象并继承对象中的属性,这就是原型对象链:对象继承其原型对象,而原型对象继承它的原型对象,以此类推. 我们创建的每一个函数都有一个prototype(原型)属 ...
- JavaScript 原型 原型链
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...
- js中的原型,原型链和继承
在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript最 ...
- javascript原型原型链 学习随笔
理解原型和原型链.需从构造函数.__proto__属性(IE11以下这个属性是undefined,请使用chrome调试).prototype属性入手. JS内置的好多函数,这些函数又被叫做构造函数. ...
随机推荐
- Guitar Pro里的编谱方式怎么用?
今天来教大家如何使用Guitar Pro中的编谱方式来让我们的乐谱更加美观整齐耐看,我们一起get起来吧! 相信我们每一个人在使用Guitar Pro进行编曲创作时,都会碰到这种情况,在乐谱上,会看到 ...
- oracle常用的数据字典查询语句
select * from all_source where owner='user_name' and type = 'PROCEDURE' and upper(text) like upper(' ...
- 【C++】10.18日的C++笔记
使用memset初始化一个类会导致类中的指针和虚函数表出现问题.相关链接 使用memset(a,1,sizeof(a))初始化a数组不会达到预期的效果,因为memset会把每个字节赋值为1就会变成16 ...
- 正则化,L1,L2
机器学习中在为了减小loss时可能会带来模型容量增加,即参数增加的情况,这会导致模型在训练集上表现良好,在测试集上效果不好,也就是出现了过拟合现象.为了减小这种现象带来的影响,采用正则化.正则化,在减 ...
- Ajax+Struts2用户注册功能实现
详细请参考源码(Github):https://github.com/QQ3330447288/ajaxRegister 1.目录结构 2.截图 3.核心代码: register.jsp <sc ...
- linux软件管理之概述
软件包管理 ====================================================================================安装/查询/卸载 一 ...
- 跟敲MySQL数据库实用教程
MySQL数据库操作 创建数据库 create database if not exists test; 查看数据库 show databases; show databases [ like wil ...
- Android之Fragment(碎片)方方面面
Fragment简介碎片(Fragment)是一种可以嵌入到活动当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间. Fragment的生命周期 它与Activity生命周期的关系: 可以看到 ...
- java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化
需求:远程服务接口模板化配置提供接入服务 模板接口分为三个模块:功能路由.参数校验.模板入库 路由:这里的实现方式很简单,就是根据业务标识找到对应的处理方法 参数校验: 参数校验这步涉及模板和校验类两 ...
- Lucene全文检索入门使用
一. 什么是全文检索 全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程 全文检 ...