乐趣区

关于javascript:js3原型

对象的原型

隐式原型(对象的原型)

晚期的 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 = 18
console.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

退出移动版