原型对象
-
程序员创建的每一个函数,解析器均会向该函数中添加一个属性prototype
-
prototype属性对应一个对象,该对象即原型对象
-
若函数作为普通函数进行调用,prototype属性没有作用
-
若函数作为构造函数进行调用,其所创建的所有对象(实例)中均有一个隐含属性
-
该属性指向构造函数的原型对象
-
可通过
__proto__
访问该属性function MyClass() { } var mc = new MyClass() console.log(MyClass.prototype==mc.__proto__) // 结果:true
-
-
原型对象相当于一个公共区域,所有同一个类的实例均可访问原型对象
MyClass.prototype.x=123
-
当用户访问对象的属性或方法时,会先在自身中寻找
-
若存在,则直接使用
-
若没有则去其原型对象中寻找,找到则使用,没找到则返回undefined
console.log(mc.x) // 结果 :123 console.log(mc.a) // 结果 : undefined
-
-
创建构造函数时,将对象中共有的属性和方法,统一设置到该原型对象中
-
优点:
- 不用分别为每一个对象添加属性和方法
- 不会污染全局作用域
-
-
使用in检查对象中是否含有某个属性
-
对象中没有但其原型中有,会返回true
console.log(mc.hasOwnProperty('name')) // 结果:false
-
-
使用hasOenProperty方法检查对象自身中是否含有某个属性,其结果为布尔值
-
原型对象也是对象,也有其原型
-
用户使用一个对象的属性或方法时,会优先在其自身寻找
-
自身中包含,则直接使用
-
自身中不包含,则向上其原型对象中寻找
- 若原型对象中包含则使用
- 若原型对象中不包含则再向上一级原型寻找,直至Object对象中的null结束,此时返回undefined
-