本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
原型
定义原型
- 原型实际上就是一个普通对象,继承于Object类
- 原型由JavaScript自动创建并依附于每个函数身上
- 可以通过function.prototype访问和操作对象。
function P(x){
this.x = x;
}
P.prototype.x = 1;
访问原型
- 访问原型对象有三种方法(obj表示实例对象)
-
obj.proto
- 是一个私有属性,可读可写,可以访问实例的原型对象
-
obj.constructor.prototype
- 先用constructor访问构造函数,再用prototype访问函数的实例对象
-
Object.getPrototypeOf(obj)【推荐】
- _proto_是私有属性,存在浏览器兼容问题。
- 若constructor属性值被覆盖,则第二种方法会失效
设置原型
- 设置对象有三种方法(obj表示实例对象,prototypeof表示原型对象)
- obj.proto=prototypeObj
- Object.setPrototypeOf(obj,prototypeObj)
- Object.create(prototypeObj)
检测原型
- isPrototypeOf方法,判断该对象是否为参数对象的原型。
- isPrototypeOf是一个原型方法,可以在每个实例对象上调用。
var F = function(){};
var obj = new F();
var proto1 = Object.getPrototypeOf(obj);
console.log(proto1.isPrototypeOf(obj));
//true
原型属性
-
原型属性可以被所有实例访问,而私有属性只能被当前实例访问。
-
如果给构造函数定义了与原型属性同名的私有属性,则私有属性会覆盖原型属性值
-
如果使用delete运算符删除私有属性,则原型属性会被访问。
原型链
- 在JavaScript中,实例对象在读取属性时,先检查私有属性,如果存在,则返回私有属性。否则就会检索prototype原型,若找到同名属性,则返回prototype原型的属性值。
- prototype原型允许引用其他对象。如果在prototype原型中没有找到指定的属性,则JavaScript会根据引用关系,继续检索prototype原型对象的prototype原型。