prototype与__proto__


一、各种概念

1.构造函数

创建新对象初始化的函数叫做构造函数.

2.实例(对象)

用new调用构造函数创建出来的对象叫做实例,或是实例对象.

3.prototype属性

也叫原型属性,它是函数独有的,每个函数都有一个prototype属性,它是一个指针,指向一个对象,这个对象包含了所有实例共享的属性和方法.

4.原型对象

prototype属性指向的那个对象叫做原型对象.

5.proto

实例对象都有的属性(proto左右各两个短杠),它指向了该实例对象对应的原型对象.

二、prototype与__proto__的联系

prototype与__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象;任意一个构造函数实例化的对象,都有一个__proto__对象,它指向构造函数的原型对象.

三、prototype与__proto__的区别

1.prototype是函数独有的,而__proto__是每个对象都会拥有的(包括函数)
2.prototype的作用是保存所有实例公共的属性和方法;__proto__的作用是当访问一个对象的属性时,如果内部没有该属性,就会在它的__proto__属性所指的那个父对象去找,父对象没有,再去父对象的父对象里找…直到null,即原型链.
3.s.proto === Student.prototype
prototype还有一个constractor属性,指向该对象的构造函数本身.

四、代码示例

代码如下(示例):

	function Student(newId, newName){
		this.id = newId;
		this.name = newName;//这俩是每个实例对象特有的
		// this.prototype = "haha";//这相当于给this添加了一个名叫prototype的属性,不能这么用.
		// this.prototype.eat = function(){
		// 	console.log("eat");
		// }//不能写在里面this是实例对象,实例对象没有prototype的方法
	}
	Student.prototype.eat = function(){
		console.log("eat");
	}
	Student.prototype.teacher = "dahuang";//为原型对象添加新共有属性
	let s = new Student(1,"laowang");

	s.teacher = "xiaobai";//为实例对象添加了一个实例属性,覆盖了实例对象原有的原型对象.
	delete s.teacher;
	console.log(s.teacher);//删除后,实例对象的原型对象属性恢复.
	
	console.log(s.__proto__ === Student.prototype);//true
	console.log(Student.prototype.constructor === Student);//true	

参考:

  1. prototype和__proto__的关系是什么?
  2. 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
  • 16
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值