参考阮一峰的文章:http://javascript.ruanyifeng.com/oop/encapsulation.html
prototype对象的真正作用
在JavaScript语言中,每一个对象都有一个对应的原型对象,被称为prototype对象。定义在原型对象上的所有属性和方法,都能被派生对象继承。这就是JavaScript继承机制的基本设计。prototype对象的作用,就是定义所有实例对象共享的属性和方法,所以它也被称为实例对象的原型,而实例对象可以视作从prototype对象衍生出来的。
function Cat(name, color) { this.name = name; this.color = color; this.meow = function () { console.log('mew, mew, mew...'); }; } var cat1 = new Cat('大毛', '白色'); var cat2 = new Cat('二毛', '黑色'); cat1.meow === cat2.meow // false function Animal (name) { this.name = name; } Animal.prototype.color = "white"; var cat1 = new Animal('大毛'); var cat2 = new Animal('二毛'); cat1.color === cat2.color//true原型链
“原型链”的作用在于,当读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。以此类推,如果直到最顶层的Object.prototype还是找不到,则返回undefined。
举例来说,如果让某个函数的prototype属性指向一个数组,就意味着该函数可以用作数组的构造函数,因为它生成的实例对象都可以通过prototype属性调用数组方法。
function MyArray (){} MyArray.prototype = new Array(); MyArray.prototype.constructor = MyArray; var mine = new MyArray(); mine.push(1, 2, 3); mine.length // 3 mine instanceof Array // true
Object.create方法
Object.create
方法用于生成新的对象,可以替代new
命令。它接受一个对象作为参数,返回一个新对象,后者完全继承前者的属性,即前者成为后者的原型。
var o1 = { p: 1 }; var o2 = Object.create(o1); o2.p // 1
上面代码中,Object.create
方法在o1
的基础上生成了o2
。此时,o1
成了o2
的原型,也就是说,o2
继承了o1
所有的属性的方法。Object.create
方法基本等同于下面的代码,如果老式浏览器不支持Object.create
方法,可以用下面代码自己部署。
另外可以参考一篇文章:https://segmentfault.com/a/1190000008739672