Javascript对象、原型、继承什么的最傲娇了

最近辞职鸟,又可以开心地无打扰地学习了。O(∩_∩)O~
现实是残酷的,JS的对象和继承这部分看了好几个月了,还是没有进展,理解起来一团糟,超级抽象。
于是我开始自怨自艾,我开始后悔当初没有选择计算机专业,于是……

你是否和我一样的烦恼?
打住!
这不是你的错!

说说个人的感觉吧,W3School什么的讲得不错,不过太简略了,而网上百度出来的相关文章良莠不齐,好的文章多半是一些大牛的博客,需要一些背景知识才能看懂,而且他们好喜欢拿Java来类比,难不成为了这个比喻我还要去学习Java 囧rz……余下的,多数文章都是COPY,举的例子都那么雷同,正当我迷茫的时候,突然想起还有书这位好家伙。

书本是个好东西啊啊啊!!!
书的优点:知识系统!知识专业!表达严密!

下面进入正题

我觉得上面的吐槽才是主要的内容,下面的主要是笔记吧。

Javascript的对象这一节相信不是那么简单就能理解的,个人觉得主要的原因不是难,而是知识点比较广,另外比较抽象而又缺少实践。

先有几个概念要弄清:

  1. 先是对象的概念,这里不说了,为啥呢,因为网上的文章这部分都讲烂了。//感觉就是该详细的地方略过,不该详细的地方使劲举例。
  2. 然后是原型(prototype),网上说那么玄干嘛!说白了就是一个特殊的实例。对一个构造函数A来说,A的原型就是A的一个特殊的实例!用A.prototype来表示。这里补充一下,原型是对构造函数来说的,实例没有原型的说法,不过在浏览器内部,每一个实例会有一个_proto_的指针,指向的是把a生出来的时候A的原型,这个指向不可见,不过在chrome或者FF的控制台里面看得到,用a._proto_表示的,并且A的prototype和a的_proto_不是永远相等的!当a从A生出来之后,如果执行A.prototyoe=YYY,a._proto_就和A.prototype没有一毛钱关系了!A的原型就是YYY了,后来A生出来的宝宝的_proto_也是指向YYY了,而a._proto_还是指向最初的那个A的原型。

上面的prototype这个概念把我搞得好辛苦啊,还是看书好,对了,这本书就是《Javascript高级程序设计》Professional.JavaScript.for.Web.Developers.已经出到第三版了,我看的是第二版的。
然后就是几个检验实例和构造函数之间关系的函数。

  • constructor属性(Object.prototype.constructor):指向创造prototype属性所在的构造函数,是prototype的一个属性,可修改,除非是基本数据类型1、'1'、true。例:alert(a.constructor) //A
  • instanceof操作符:检查实例是否指向某个构造函数的原型。constructor属性指向是唯一的,instanceof就不是了,a可能既是A的实例又是B的实例,同时所有的实例都是Object的实例。例:
function A(){};
function B(){};
B.prototype = new A();
b = new B();
b instanceof B; //true
b instanceof B; //true
b instanceof Object; //true
  • isPrototypeOf()方法:检测某个原型是否是被某个实例所指向,正好和instanceof操作符逆向的操作,也就是说a instanceof A 等于 A.prototype.isPrototypeOf(a)。
    继续使用上面的例子,那么B.prototype.isPrototypeOf(b)就是true,A.prototype.isPrototypeOf(b)也是true。

注意这里的A.prototype和B.prototype是不等的,然后,B.protoype有一个隐藏的_proto_属性指向了A.prototype,而b的_proto_指向B.prototype,所以b当然也指向A.prototype啦。

  • hasOwnProperty()方法:如果实例的某个属性来自于实例,返回true,其余的比如来自于原型啊,就false。例:alert(a.hasOwnProperty("name"))
  • in操作符:不管实例的某个属性来自于实例自身还是实例通过原型访问到的,只要存在,都是true。例:alert("name" in a)。 PS:对于in操作符还有一个地方出现就是for in循环。

来,我们做点题目巩固一下。

function A(){};
function B(){};
function C(){};
B.prototype = new A();
b = new B();
B.prototype = new C();
b2 = new B();
b instanceof A; //true
b instanceof B; //false
b instanceof C; //false
b instanceof Object; //true 
b.constructor; //A
b2.constructor; //C

看完了还是一头雾水?那么……看书去吧o( ̄▽ ̄)o

标签: js, 继承, 原型, prototype

添加新评论