超级解说老妪能解原型与原型链,proto和prototype以及Object
很多书上对原型描述的不是很清楚,特别是proto和prototype让很多人分不清,现在我在这里做下归纳以及区分,看懂这篇文章具有具备一定的关于原型的知识,不适合初学者,这篇文章花了我很大的心血,还没有全部写完,是我的各种总结和归纳,非常重要,之后会持续更新,如果有不对的地方还请指正,有疑问尽管提出来,写得很晚了,现在是晚上3点,明天还要起床搬砖,今天就先这样吧~
一:对象的原型基本概念
凡是有函数就有属性prototype
由某一个函数new出来的对象,会自动连接到改函数的prototype
prototype是构造函数的原型属性,是该函数创建的对象的原型对象
__proto__是对象的原型对象,是创建该对象的构造函数的原型属性
对象的原型对象就是构造函数的原型属性
煮个栗子
var o = new Object();
o.name = ‘haha’;
监听对象o通过该图我们可以看到每个对象都有一个__proto,__proto里又有__proto,原型对象也是对象,原型对象里有原型对象又有原型对象一直到null,这样就形成了一条原型链,构造函数创建了一个对象,这个构造函数里有个prototype属性,其实就是Object.prototype,里面的constractor指向这个构造函数,constractor翻译过来就是构造器的意思,获取一个函数,所以点开constructor,里面在点开prototype会发现和对象的__proto是一样的结构,所以构造的原型对象就是构造函数的原型属性
验证一下对象的原型对象是否是构造函数的原型属性
通过画图来表达,这个是对象的原型链
根据上面的,我们在来看一个简单的函数通过上面分析来画一个简单的对象原型链
function Person() {}
var p = Person();
我们可以分析出它的原型链结构:p -> Person.prototype->Object.prototype
然后画图
基本结论
1.对象都有原型对象,对象默认继承自原型对象
2.函数被定义后,默认就有原型属性,原型属性也是对象
3.函数的原型属性默认继承Object.prototype
4.原型对象中constructor指向对应的构造函数
5.所有的函数都是function的实例
6.函数也是对象
举例function Fn() {}
function Foo() {}//是对象的情况下
内存图
function Foo() {}//是函数的情况下
函数Fn是function的实例
Function是Fn的构造函数
原型对象就是构造函数的原型属性 Fn.__proto__ ==Function.prototype
Function.prototype.__proto__==Object.prototype
Function是任意函数的构造函数
接下来画一整条原型链
function Foo1(){}
function Foo2(){}
var f1 = new Foo1();
var f2 = new Foo2();
Function和函数和Function.prototype之间的关系
函数Fn是Function的实例
函数继承自Function.prototype
Function.prototype继承自Object.prototype函数的原型属性继承自Object.prototype
Array/Date/Object是Function的实例,继承自Function.prototype
Function是Function的实例,继承自Function.prototype
结论:Function.__proto__就是Function.prototype
Function和构造函数和Object.prototype之间的关系
构造函数和Object函数都是Function的实例,继承自Function.prototype的属性
构造函数prototype和Funtcion.prototype继承自object.prototype
proto和prototype的区别?
相同点:
1.两个都是属性,存储引用的变量
2.同一个构造函数,与构造的实例对象,这两个属性的引用对象是同一个对象
不同点:
1.在不同的角度,使用者两个属性
prototype使用在构造函数后面 Function.prototype
__proto__使用在对象后面 fn.__proto__
2.描述也不相同
prototype 叫做构造函数的原型属性
__proto__ 对象的原型对象
3.__proto__是非标准属性
所以我们在描述对象的时候会说对象会链接在原型对象上
原型对象的作用
1.创建对象的一般方法(使用构造函数)
2.对象的存储结构
3.共享行为应该共享数据和代码
设置原型对象的方法
1.利用对象动态属性的特征给原型添加数据
2.替换原型对象
3.对象类型与原型类型(鸭子辨型)