Published on

理解Javascript中的__proto__

Authors
  • avatar
    Name
    Pursue
    Twitter

Summary

proto可以看作是一个公开对象原型的内部访问器,大多数浏览器都实现了该属性。一个对象如何访问原型链上的方法,都是取决于proto的,因此暴露了这个属性则势必会为对象的安全性带来影响,所以 MDN 并不推荐随意改变一个对象的原型链,但是我们还是有必要了解它。

Syntax

function Circle() {
  this.name = 'circle'
}
Circle.prototype.area = function () {
  return 1.0
}

var shape = {},
  circle = new Circle()
console.log(shape.__proto__) // Object {}
// Set the object prototype
shape.__proto__ = circle
// Get the object prototype
console.log(shape.__proto__) // Circle {name: 'circle', area: function}

上述例子中的 shape 对象首先由 Object 构造而来,因为起原型链指向 Object.在改变其原型链指向 circle 后,则 shape 成为了 Circle 的实例,因为 shape 具有原生属性 name 和原型方法 area。

需要注意的是,如果将上述代码改为shape.__proto__ = Circle.prototype的话,则 shape.__prototype 将输出 Circle {area: function}.

要理解proto,可以参考 Object.creat()方法。