js原型系统
对象是对数据和行为的抽象,我们可以把一些关联的数据,和对该数据处理的算法封装在一起,并且用一个名字描述它,这样我就把一堆东西用一个名词表示了,对象对我们隐藏了数据的复杂度,使我可以在思考的时候把系统划分各种对象,更符合人类的思维,也更容易复用数据
js是原型继承范式,没有类,当你看上一个对象的时候,你就可以以某个对象为原型创建一个克隆了它的对象,Object.create(xiaoming);
js里面的每一个对象都有一个原型,这样优点类似吸血鬼的机制
所有对象的祖先原型为 Object.prototype, 该原始原型,躲藏在内存深处,只有通过这个Object.prototype这条路能找到它,任何对象的属性查找,如果原型链上都没,就会查到这个原型链条末端的原始对象.
var Person = function(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
}
var linhuansen = new Person('lihuanseng');
当new的时候发生了什么
new 运算符,首先在内存中开辟了一个空间,
{ }
然后在在该空间添加了 _proto_ 属性
{
_proto_: {
该对象为Person构造函数的原型对象
即Person.prototype
_proto_: {
该对象为祖先原型
即Object.prototype指向的原型
}
}
};
然后把该空间绑定到函数的this 上;
构造函数内的代码就相当对该对象进行装饰,给该空间添加一些属性
构造函数的原型会被所有的new 出来的实例共享,所以会把一些对对象处理的方法,封装到原型上,
这样每个对象都可以通过原型链条,查找该原型,访问上面的方法,做到了节约内存