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面向对象的本质,你搞懂了么?还是晕了,
如果晕了,再看几次。
原文:https://www.cnblogs.com/blakehuangdong/p/11329690.html