JS原型
在 JS 中,主要有两种创建对象的方法, 分别是对象字面量以及调用构造函数
1 | //对象字面量 |
prototype 、constructor
** 每个函数 **默认会有一个prototype
属性指向它的原型对象,
该原型对象会有一个constructor
的属性,该属性包含一个指针,指向prototype
属性所在函数,即
1 | Object.prototype.constructor === Object |
__proto__
每一个对象都有一个隐式的__proto__
属性,指向它们的构造函数的原型,即
1 | obj1.__proto__ === Object.prototype // true |
1 | obj1.__proto__.constructor === Object // true |
prototype 和 __proto__ 的区别
prototype
是函数才有的属性,__proto__
是对象和函数都有的属性(不是一个规范属性,只是部分浏览器实现了此属性,对应的标准属性是 [[Prototype]]
)
Object 和 Function 的关系
Object
是Function
的实例对象, Function.prototype
是Object
的实例对象。Object本质是函数,Function本质是对象。
1 | Object.__proto__ === Function.prototype; |
原型继承
利用 js 的原型,可以实现继承。
1 | function Box() {} |
除了Object
的原型对象Object.prototype
的__proto__
指向null
,其他内置函数对象的原型对象(例如:Array.prototype
)和自定义构造函数的__proto__
都指向Object.prototype, 因为原型对象本身是普通对象。
ES5 有了 Object.create()
,让我们更便捷地使用原型继承,Object.getPrototypeOf
、Object.setPrototypeOf
可以更自由地操控原型链。
1 | function Box() {} |