JavaScript-OOP

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
2
3
function foo() {
return 0;
}

function is also an object, its prototype is:

1
foo ---> Function.prototype ---> Object.prototype ---> null

如果原型链很长,那么访问一个对象的属性就会因为花更多的时间查找而变得更慢,因此要注意不要把原型链搞得太长。

Create Function

3. Prototype Inheritance

JavaScript的原型继承实现方式就是:

  1. 定义新的构造函数,并在内部用call()调用希望“继承”的构造函数,并绑定this
  2. 借助中间函数F实现原型链继承,最好通过封装的inherits函数完成;
  3. 继续在新的构造函数的原型上定义新方法。

4. Class Inheritance

0%