对象的原型
隐式原型(对象的原型)
晚期的ecma是没有标准如何查看原型
大部分浏览器给对象提供了一个属性 __proto__,能够让咱们看一下这个原型对象
var obj = {name:"hahha"}//只能够查看一下原型对象console.log(obj.__proto__);// es5之后提供了一个办法api,能够获取到对象原型console.log(Object.getPrototypeOf(obj));// 个别开发时用__proto__来做测试就行啦,api太长啦 不方便使用
每个对象中都是有[[prototype]],个别能够通过__proto__ 或者getPrototypeOf办法拿到
咱们称之为隐式原型,咱们个别不会对其做解决,也看不到,也不会间接用它
原型的作用// 当咱们从一个对象中获取某一个属性时,会触发其中的[[get]]操作// 在查找的过程中过登程两个操作// 1.在以后的对象中去查找对象的属性,如果找到就会间接应用// 2.如果没有找到,就会沿着原型链去查找// 原型和以后对象都没有age属性console.log(obj.age);//undefined// 能够向以后对象的原型中增加age属性obj.__proto__.age = 18console.log(obj.age);//18
显示原型(函数的原型)
二:显示原型(函数的对象)
`function foo(){
}`
函数他也是一个对象,所以他也有一个隐式原型__proto__ [[prototype]]
但函数还会多进去一个属性,叫做显示原型:prototype
prototype这个不是浏览器提供的,所以不存在浏览器兼容的问题,这个时ecma提供的console.log(foo.prototype);
显示原型最重要的作用就是 第二条
当通过new关键字调用构造函数时
1.在内存中创立一个新的对象(空对象)
2.这个对象外部的[[prototype]]属性会被赋值为该构造函数的prototype属性
3.构造函数外部的this会指向创立吹来的新的对象
4.执行函数的外部代码(函数体代码)
5.如果构造函数没有返回非空对象,则返回创立进去的新对象
// 例如
function Person(){
}
var p1 = new Person()
var p2 = new Person()
console.log(p1.__proto__==Person.prototype);//true
console.log(p2.__proto__==Person.prototype);//true