JS如何做到面向对象

JS本身没有面向对象,它是如何来做类,和类的实例的呢?。

1: 函数对象的prototype

   每个函数对象都有一个prototype成员,指向一个表,

function a() {};   a.prototype 指向一个表对象

2: 表的__proto__

  每个js表(Object)对象,都会有一个成员__proto__, 指向一个表(Object)对象。当我们访问这个Object的key的时候,先在它自己的表里找,如果没有找到,接着在它的__proto__表里找,如果__proto__表里没有,到__proto__表里的__proto__表里找,….只到全部搜索完成;

3: new+ 函数机制

  var a = new A(); 这个是一个典型的new + 函数的模式,

在JS里面我们将A函数称为构造函数, 那么new A()到底做了哪些事情呢?

(1)参生了一个新的表对象{}, 下称instance;

(2)将instance,作为this, 传递给A函数;

(3) 将A函数的prototype表种的key, value复制到instance表里面的__proto__下面;

(4) 返回 新的对象表实例instace;

4: js 如何面向对象

(1)定义构造函数:

Function Person() { … …}

(2) 往构造函数的prototype表里面加成员函数

   Persion.prototype.set_age = function(age) {}

(3) new + 构造函数后得到的新对象;

  Var a = new Person(); a 是一个表 {… , __proto__: {set_age: 函数对象(来源于prototype)}},

 

(4) a.set_age(10); 在a实例表里面找, 没有找到set_age,

就到__proto__里面找,找到了,所以a.set_age() 就调用到了上面的set_age函数,根据隐式传递this, 进入set_age后this是a实例;

 

所以,a是Person的实例,通过实例,可以调用到类的方法,这个是js面向对象的本质,你搞懂了么?还是晕了,

如果晕了,再看几次。

猜你喜欢

转载自www.cnblogs.com/blakehuangdong/p/11329690.html