说到原型就不得不说构造函数,js一切皆对象,但分为普通对象和函数对象,构造函数就属于函数对象,所谓的原型和继承也是在函数对象下实现的
了解原型与原型链需要知道的三个构造函数属性(prototype, __proto__, constructor)
1. prototype、__proto__
prototype:原型是函数类型对象的一个自带属性'prototype',这个属性其实也是一个对象,有自己的属性和方法,通过原型可以实现对象的属性继承,null和undefined没有原型和原型链。
__proto__: “prototype”作为对象的内部属性,是不能被直接访问的,Firefox和Chrome中提供了__proto__这个非标准(不是所有浏览器都支持) 的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。
对象的原型链那么一个对象的[[prototype]]属性究竟怎么决定呢?这是由构造该对象的方法决定的。据我所知有三种构造一个对象的方法:
然而虽然说[[prototype]]是一个隐藏属性,但很多浏览器都给每一个对象提供.__proto__这一属性,这个属性就是上文反复提到的该对象的[[prototype]]。由于这个属性不标准,因此一般不提倡使用。ES5中用Object.getPrototypeOf函数获得一个对象的[[prototype]]。ES6中,使用Object.setPrototypeOf可以直接修改一个对象的[[prototype]]
2. 在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应当前对象原型的实例的构造函数。
object.constructor指向object的构造函数,而构造函数的constructor指向的也是自己本身,所以object.constructor.constructor........。最后还是指向的是object的构造函数本身,
constructor属性不影响任何JavaScript的内部属性。instanceof检测对象的原型链,通常你是无法修改的(不过某些引擎通过私有的__proto__属性暴露出来)。constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。不过,从编程习惯上,我们应该尽量让对象的constructor指向其构造函数,以维持这个惯例。
网友评论