OOP
1. Basic Ideas
- JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。
- JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。
- 在JavaScrip代码运行时期,你可以把一个对象从
A变成B,或者变成任何对象。 - 在编写JavaScript代码时,不要直接用
obj.__proto__去改变一个对象的原型。 Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有
2. Create Object
JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象。
当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype对象,最后,如果还没有找到,就只能返回undefined。
e.g.
(1) create a Array object:
1 | var arr = [1, 2, 3]; |
Its prototype chain is:
1 | arr ---> Array.prototype ---> Object.prototype ---> null |
(2) create a function:
1 | function foo() { |
function is also an object, its prototype is:
1 | foo ---> Function.prototype ---> Object.prototype ---> null |
如果原型链很长,那么访问一个对象的属性就会因为花更多的时间查找而变得更慢,因此要注意不要把原型链搞得太长。
Create Function
3. Prototype Inheritance
JavaScript的原型继承实现方式就是:
- 定义新的构造函数,并在内部用
call()调用希望“继承”的构造函数,并绑定this; - 借助中间函数
F实现原型链继承,最好通过封装的inherits函数完成; - 继续在新的构造函数的原型上定义新方法。