原型对象的创建
- 我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向函数的原型对象。
原型对象
-
所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性指向prototype属性所在函数的。
-
原型对象还有很多从Object继承来的属性和方法。
- 当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象--[[prototype]]。
[[prototype]]
这个是一个指针,这指针指向原型对象。 脚本没有标准的方式访问这个[[prototype]],但FireFox Safari Chrome 都支持一个属性称为proto (称为“隐式原型”)
连接存在于实例和原型对象之间,而不是实例与构造函数。
Person–> Person.prototype <–person1
-
上图展示了Person构造函数、Person的原型属性以及现有的两个实例之间的关系。
-
构造函数的prototype属性指向原型对象,原型对象的constructor属性又指回了构造函数!
-
原型对象除了包含constructor属性之外,还包括后来添加的其他属性。Person的每个实例都包含一个内部属性——“proto”,这个属性仅仅指向了
-
Person.prototype,即:Person.proto === Person.prototype;换句话说,它们与构造函数没有直接关系。
isPrototypeOf
判断某个实例和某个原型的对应关系。
Person.prototype.isPrototypeOf(person1);//true
它就是判断实例的[[prototype]]是否指向调用这个方法的对象。
Object.getPrototypeOf
ES5新方法,用来获取一个实例的原型。
Object.getPrototypeOf(person1)==Person.prototype; // true
Object.getPrototypeOf(person1).name; // "Nicholas"
返回的原型,可以访问这个原型中的属性方法值。
我们在使用原型继承的时候会用到这个方法。
原型链
原理:每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始,如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中搜索给定名字的属性。如果搜索到了属性就停止。仍然搜索不到,就搜索这个原型对象的上一级的原型对象,直到Object.prototype,这个是所有对象的根原型对象,它的上一级是null。
网友评论