原型与原型链 详解

搞懂原型链之前一定要搞懂原型是啥
搞懂原型之前要搞懂__proto__、 constructor和prototype是啥

首先我们第一步就是引入一个概念,在js一切皆是对象(null和undefined不是),所以函数也是对象的一种。
第二个就是任何函数都可以是构造函数,但是函数不是构造函数,函数被调用才是构造函数。比如:

//定义一个函数,那它只是一个普通的函数,不是构造函数
var Parent = function(){
    this.num=20,
    this.name="父类"
}//相当于 function Person(){}

var son = new Parent();//创建了一个Parent构造函数的实例
//这时这个Parent就是是一个构造函数。因为通过new关键字调用了它

弄懂这两个概念以后,我们开始学习几个知识点,就是__proto__,constructor和prototype。

1.prototype
先看prototype,我们可以百度翻译得知,proto的意思是原型机,也就是可以将prototype翻译为原型对象。这个属性只有函数才会有,不是函数只会输出undefined

console.log(son.prototype);//输出"undefined"

所有的js对象都会从prototype原型对象中继承属性和方法。每个继承的对象都不一样

Date 对象从 Date.prototype 继承。
Array 对象从 Array.prototype 继承。
Person 对象从Person.prototype 继承。

这个原型对象就是相当于js父对象专门给子对象留的属性和方法的调用集合(可以这么理解)
我们也可以在原型对象中添加一个值
比如

Parent.prototype.name1 = "我是原型属性";
console.log(Parent.prototype.name1);//输出"我是原型属性"
console.log(son.name1);//输出"我是原型属性"

如图显示
在这里插入图片描述

但是注意的是,这里添加的是原型对象里面,父类直接读取时会报错的。如图
在这里插入图片描述

2.proto 属性
_proto_相当于子类读取父类的prototype属性的方法(是读取父对象的原型对象不是父对象),如图,一模一样。
在这里插入图片描述

我们也可以输出一下进行判断,确实是指向其父对象的原型对象

console.log("son.__proto__是否等于Parent.prototype: ");
console.log(son.__proto__ === Parent.prototype));//true
console.log("Parent.__proto__是否等于Object.prototype: ");
console.log(Parent.prototype.__proto__ ===Object.prototype)) //true

同理,构造函数的实例son也可以在这里调用父对象的属性,包括prototype属性,这个_proto_在调用的时候也是可以省略的(name是函数自带的变量,name1是插入到prototype的变量)。
在这里插入图片描述

3.constructor
它是从一个对象指向一个函数的。指向的函数就是该对象的构造函数。我们可以打印son的构造函数试一下。
在这里插入图片描述

至于Parent的构造函数,那就是Function(所有函数都是这个调用)
在这里插入图片描述

原型链的解释
在Javascript中如果访问一个对象本身不存在的属性或是方法,就首先在它的原型对象上去寻找,比如说son.toString();son本身没有toString函数,这些都是在他的父组件的原型对象里面声明的。如果原型对象上也不存在,就继续在原型对象的原型对象上去寻找,直到找到为止。这个就是我们说的原型链。

那么原型对象有尽头么?所有对象的原型尽头Object.prototype,
那么Object.prototype这个对象的_proto_指向啥呢?答案是null,所以说Object是所有对象的父对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值