今天除了面试thoughtworks凉了意外,中午没睡着午觉意外,晚上饿的半天没吃到饭意外,剩下大部分时间应该就是在看JS的原型链了。为啥突然想看这个我也说不清,但是是时候总结一下今天的成果了。老规矩,如有错误,欢迎指点。
一切的一切都是两个属性____proto__(不太会用markdown,想打出来正常的proto但就是给我变成粗体识别出来,只能多加两个下划线了)和prototype,首先发布我迷惑了半天的一点,只有函数才拥有prototype这个属性。而在JS中,万物皆对象,这是真的比Java还狠,连类都没,真的是只剩下对象了,所有的对象都有____proto__属性。然后就是一个表达式。
对象.____proto__ = 构造函数.prototype
我们管prototype叫做函数的原型对象,它也是一个对象,是在用构造函数创建对象的时候,把构造函数的原型对象赋给生成对象的原型(____proto__)中。大概就是在生成的对象中,保留一个自己构造函数的原型对象(我到现在也不知道这个对象和构造函数究竟有多大的关系,然而我们探讨的似乎始终就是这个问题)。我是非常能体会Java同学心中的痛楚的,怎么感觉说了这么多,什么构造函数什么的,就是不见类的身影呢,没有类,怎么保存对象的属性和方法呢艹。然而,JS就是通过这个原型对象来保存的。
查看对象原型的两种方法:
1, obj.____proto__
2, Object.getPrototypeOf(obj)
说说原型链没准能够更好得帮我们理解原型的概念。什么是原型链呢?
在JS中,万物皆对象,任何对象都有____proto__属性,也就是连接当前对象和自己构造器原型对象的一个属性,这样一层一层的往上递归,到最后的一个对象会是Object对象的原型对象,而Object的原型是为null的。这个对象链条就被称作原型链好像,说实话,这个继承关系,和Java里面的类的继承最大的区别就是,Java中是依靠类来保存属性信息的,而JS中可以依靠构造函数来保存,而构造函数又是对象,也就是说,JS整个继承链中,全都是通过对象来保存继承关系的。。想想都觉得真的好奇怪啊!由此,当在一个对象上找属性找不到的时候,就会去原型链上面查找,但是却不会在自身的prototype上查找。
说实话,写了这么些,我自己都开始对原型和原型对象这两个词抱有迷惑了,希望有大佬可以指点一下。目前先暂定为一个意思吧。
网友评论