【js】prototype和__proto__的区别和联系

零、明确两点

  • JavaScript中的函数是对象,而且除了使用字面量定义外,都需要通过函数来创建对象;
  • prototype构造函数访问原型对象,__proto__对象实例访问原型对象。

一、prototype和__proto__的区别

1.prototype是函数才有的属性

具体原因,可以看看阮一峰大神的这篇文章Javascript继承机制的设计思想,里面介绍了prototype的设计由来。

2.__proto__是每个对象都有的属性

它不是一个规范属性,该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它。__proto__属性已在ECMAScript 6语言规范中标准化,用于确保Web浏览器的兼容性,因此它未来将被支持。它已被不推荐使用, 现在更推荐使用Object.getPrototypeOf/Reflect.getPrototypeOfObject.setPrototypeOf/Reflect.setPrototypeOf

3.用法

  • prototype属性可以给函数和对象添加可共享(继承)的方法、属性
  • __proto__是查找某函数或对象的原型链方式
<script type="text/javascript">

function employee(name,job,born)
{
	this.name=name;
	this.job=job;
	this.born=born;
}

var bill=new employee("Bill Gates","Engineer",1985);


employee.prototype.salary=null;

bill.salary=20000;

document.write(bill.salary);

</script>

二、联系

prototype__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象,同样任意一个构造函数实例化的对象,都有一个__proto__属性(__proto__并非标准属性,ECMA-262第5版将该属性或指针称为[[Prototype]],可通过Object.getPrototypeOf()标准方法访问该属性),指向构造函数的原型对象。如下代码所示:

function a() {
    //console.log("I'am a function.");
}
//b是实例化对象,a是构造函数
var b = new a();

console.log(b.__proto__ == a.prototype);  //trueconsole.log(Object.getPrototypeOf(b) == a.prototype);  //true,标准方法返回的结果和上述一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值