原型
JavaScript中每个对象都有一个特殊的内置属性[[prototype]],指向当前对象的原型对象,该属性也称隐式原型
__proto__属性早期的ECMA是没有规范如何去查看
[[prototype]],于是浏览器中给对象中提供了一个属性,可以查看其原型对象ES5之后提供了方法
Object.getPrototypeOf()
对象的原型
当从一个对象中获取某个属性时,会触发对象的[[get]]操作
- 在当前对象中查找到对应的属性时,就直接使用
- 如果没有找到,就会沿着对象的原型去查找
函数的原型
函数也是一个对象,函数相对于对象来说,会多出一个显式原型属性prototype
原型对象
constructor属性
Object.getOwnPropertyDescriptors(foo.prototype)/*{constructor:{configurable: trueenumerable: falsevalue: [Function foo]writable: true}}直接打印foo.prototype可能看不到constructor属性,因为默认不可遍历,但在浏览器控制台里输出会显示*/
修改原型对象过程
- 修改原型对象
- 修改原型对象中构造函数的绑定
function foo(){};// 1. 修改原型对象foo.prototype={name:'rv',age:20}// 2. 修改原型对象中构造函数的绑定Object.defineProperty(foo.prototype,'constructor',{configurable: true,enumerable: false,value: foo,writable: true})/*此处推荐使用Object.defineProperty()因为这样可以详细配置属性描述符而不推荐使用字面量形式创建属性constructor*/
原型链
继承的实现方案
详见[-类继承原理实现]
相关内容补充
方法补充
Object.create()
Object.create(prototype,property)/*参数prototype:新建对象的原型对象property:新建对象自身属性描述符返回值新建对象*/
Object.hasOwnProperty()
对象上是否有某一个自身对象的属性
in/for in操作符
判断某个属性是否在自身对象或对象的原型上
instanceof
用于检测构造函数的prototype是否出现在实例对象的原型链上
