场景:
写了一个JS类, 里面全是静态方法,开发时觉得没什么状态需要共享的,但做着做着发现掉坑里了。因为有些状态数据需要共享。到这应该知道本文要讲啥了吧?没错,就是JS的对象原型链。
JS 的对象也是使用 new 来创建,但JS new命令后面跟的不是类,而是构造函数。
用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法。
function Dog(name){
this.name = name
this.specie = 'dog'
}
var dogA = new Dog('big')
var dogB = new Dog('small')
// 这两个对象的species属性是独立的,修改其中一个,不会影响到另一个
dogA.species = 'cat';
alert(dogB.species); // 显示"dog",不受dogA的影响
每一个实例对象,都有自己的属性和方法的副本。这不仅无法做到数据共享,也是极大的资源浪费。
怎么解决呢?
使用 prototype 属性, 这个属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。
实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
refer: 阮一峰老师的Javascript继承机制的设计思想
网友评论