js 原型和原型链

一、前言

今天我们来学习老生常谈的两个问题:原型以及原型链;

什么是原型?

在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。
“[[Prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome中提供了__proto__这个非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应创建所有指向该原型的实例的构造函数

首先,来看一段代码:

	class Student{
		constructor(name,age){
			this.name = name;
			this.age = age;
	}
	introduce(){
		console.log(`我是${this.name},年龄${this.age}岁`);
	}
	}
	const student = new Student('zhangsan',18);
	console.log(student.__proto__);  // {constructor: ƒ, introduce: ƒ}
	console.log(student.prototype);  //undefined
	console.log(Student.__proto__);  // ƒ () { [native code] }
	console.log(Student.prototype);  //  {constructor: ƒ, introduce: ƒ}
	console.log(student.__proto__ === Student.prototype); // true

解读:以上代码是创建一个Student 类,并使用累实例化一个student 实例对象,通过输出对比两者的__ proto__ 和prototype属性;

二、__ proto__和prototype属性

通过上面例子,可以更好的理解以下结论:
1、__ proto__ 属性,也叫隐式原型,它是一个普通的对象,所有引用类型都有该属性(数组,对象,函数);
2、prototype属性,这也叫显式原型,它也是一个普通的对象,是函数所独有的属性。
3、对象的__ proto__属性指向它的构造函数的prototype属性。

什么是原型链

如图:
在这里插入图片描述
当实例student,调用introduce()方法时,首先会从自身找;
自身没有时,会通过student.__ proto__到构造函数的原型对象Student.prototype里面找;
如果Student.prototype里没有,就继续往上通过Student.prototype.__ proto__到构造函数原型对象Object.prototype里找,它会一层一层往上找,直到null为止;

这就是原型链,introduce()函数在类Student.prototype中,student.__ proto__ === Student.prototype;所以,实例student能够访问introduce()方法;

在下一篇文章:我们探讨 js proto、prototype、constructor的关系

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值