其实面向对象是一种编程思想,不用想的太复杂,可以想这个问题,把大象放进冰箱需要几步?面向的对象是什么,就是:打开冰箱放进大象关上冰箱,而面向过程就是这个事件的步骤,分步骤一步步实现,这就是面向过程。
需要实现拿出大象,只需要把“放进” 修改成“拿出”的步骤就可以了。
这就是面向过程,面向对象就是整个事件。
1.关键字createPerson和prototype以及__proto__
原型对象的作用和语法
function createPerson(){
}
createPerson.prototype.name = "admin";
createPerson.prototype.show = function(){
console.log("hello");
}
console.log(createPerson.prototype);
var p1 = new createPerson();
console.log(p1);
console.log(p1.__proto__);
最后会发现__proto__身上也能找到prototype添加的属性和方法。由此可以证明
createPerson.prototype 这个就叫原型对象。
那这个到底有什么用呢?首先要清楚原型对象也是一个对象,也可以向这个原型对象添加属性和方法。
而添加到原型对象身上的属性和方法并不是给函数用,而是给将来被new出来的实例的隐式原型使用。
p1.__proto__就是p1的隐式原型。
实例身上的隐式原型,是为了标记当前实例的来源函数的原型对象。
那么就可以得出
p1.__proto__ == createPerson.prototype
他们两个之间是一样的。
实例和类之间的关系就是这样子。
通过new得到的对象,也叫实例
被new执行的构造函数,也叫类
实例是类的具象化
类是实例的抽象化
如果有点难懂,可以看一下我上面举得那个例子:实例就是大象关进冰箱,类就是实现这个事件的步骤。这样就很好理解了。
接下来就是总结他们之间的关系了,他们之间的关系就是原型链。
一般情况下,一个对象类型的数据,必然会有一个隐式原型,这个隐式原型作为当前对象的父级存在
当前对象属性或方法的读写规则
读(获取)
如果一个对象不具有某个属性或方法,会顺着隐式原型找父级,找到了,可以直接使用,找不到,继续顺着隐式原型向上找父级,找不到,一直向上,直到顶端的Object,如果还是没有,那么抛出undefined,只要在某一层找到了,那么就停止
子无,找父,父无,找父之父,......
全无,undefined
某处找到,即停止
写(设置)
不往上找,直接写在当前位置,不会向上设置
只能改写自身,不能改写父级
既然叫原型链肯定有图片的啦,接下来看一下图片就可以知道他们之间的关系了。
其实那个constructor是一个补充,并不是必须要通过constructor。
只是如果你不知道是指向哪个构造函数时,可以用他来知道。
来源:CSDN
作者:如山中清风
链接:https://blog.csdn.net/m0_46370471/article/details/104735113