JavaScript 原型

prototype

在ES2019中 对于prototype的定义为浏览器

给其它对象提供共享属性的对象markdown

看完后 忽然想到了一句话 Vue中一切组件继承自Vue的原型app

这也解释了为何在每一个组件中均可以直接使用Vue的一些方法 由于这些方法被写在了Vue的原型上ide

原型对象被建立时,会自动生成一个 constructor 属性,指向建立它的构造函数函数

构造函数的prototype指向原型对象性能

实例对象的__proto__指向原型对象ui

(注)若是在MDN上查阅__proto__这一属性 你能够看到lua

已废弃 该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在将来的某个时间中止支持,请尽可能不要使用该特性。url

警告: 经过现代浏览器的操做属性的便利性,能够改变一个对象的 [[Prototype]] 属性, 这种行为在每个JavaScript引擎和浏览器中都是一个很是慢且影响性能的操做,使用这种方式来改变和继承属性是对性能影响很是严重的,而且性能消耗的时间也不是简单的花费在 obj.proto = ... 语句上, 它还会影响到全部继承来自该 [[Prototype]] 的对象,若是你关心性能,你就不该该在一个对象中修改它的 [[Prototype]]。相反, 建立一个新的且能够继承 [[Prototype]] 的对象,推荐使用 Object.create()。spa

警告: 当Object.prototype.proto 已被大多数浏览器厂商所支持的今天,其存在和确切行为仅在ECMAScript 2015规范中被标准化为传统功能,以确保Web浏览器的兼容性。为了更好的支持,建议只使用 Object.getPrototypeOf()。

官网说的很明白 若是还不理解 看完下面原型链的做用 你应该就明白了

这一部分 看着比较绕 可是理解后 对咱们仍是颇有帮助的 好比原型链的做用

原型链的做用: 原型链如此的重要的缘由就在于它决定了 JavaScript 中继承的实现方式。

当咱们访问一个属性时,查找机制以下:

  • 访问对象实例属性,有则返回,没有就经过 __proto__ 去它的原型对象查找。

  • 原型对象上找到即返回,找不到,继续经过原型对象的 __proto__ 查找。

  • 一层一层一直找到 Object.prototype ,若是找到目标属性即返回,

    找不到就返回 undefined,不会再往下找,由于在往下找 __proto__ 就是 null 了。

因此 若是咱们用Object.prototype.__proto__去操做了Object的原型对象 那么全部的对象都会受到影响 由于Object是对象的顶级父类 全部的对象都继承自它们的顶级父类Object

相关文章
相关标签/搜索