Skip to content

公共属性定义在原型上 ​

本节目标:理解“公共属性定义在原型上”的核心思路,并能把它用于实际开发或面试表达。

与 ES5 一样,类的所有实例共享一个原型对象。
var p1 = new Point(2,3);var p2 = new Point(3,2);
p1.__proto__ === p2.__proto__//true
上面代码中,p1和p2都是Point的实例,它们的原型都是Point.prototype,所以__proto__属性是相等的。
这也意味着,可以通过实例的__proto__属性为“类”添加方法。
__proto__
并不是语言本身的特性;

这是各大厂商具体实现时添加的私有属性,虽然目前很多现代浏览器的 JS 引擎中都提供了这个私有属性;

但依旧不建议在生产中使用该属性,避免对环境产生依赖。

生产环境中,我们可以使用 Object.getPrototypeOf 方法来获取实例对象的原型,然后再来为原型添加方法/属性。

var p1 = new Point(2,3);var p2 = new Point(3,2);
p1.__proto__.printName = function () { return 'Oops' };
p1.printName() // "Oops"p2.printName() // "Oops"
var p3 = new Point(4,2);p3.printName() // "Oops"
上面代码在p1的原型上添加了一个printName方法,由于p1的原型就是p2的原型,因此p2也可以调用这个方法。而且,此后新建的实例p3也可以调用这个方法。这意味着,使用实例的__proto__属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。

本站总访问 — 次