零、明确两点
- JavaScript中的函数是对象,而且除了使用字面量定义外,都需要通过函数来创建对象;
prototype
是构造函数访问原型对象,__proto__
是对象实例访问原型对象。
一、prototype和__proto__的区别
1.prototype
是函数才有的属性
具体原因,可以看看阮一峰大神的这篇文章Javascript继承机制的设计思想,里面介绍了prototype的设计由来。
2.__proto__
是每个对象都有的属性
它不是一个规范属性,该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它。__proto__
属性已在ECMAScript 6语言规范中标准化,用于确保Web浏览器的兼容性,因此它未来将被支持。它已被不推荐使用, 现在更推荐使用Object.getPrototypeOf/Reflect.getPrototypeOf
和Object.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,标准方法返回的结果和上述一样