Javascript 追本溯源
一直以来对Javascript的继承关系都是通过死记硬背下来的,对于一个理科生,喜欢逻辑思维的人来讲,死记硬背特别头痛,且理科生对于能够死记硬背下来的东西也很容易忘记,不知道其他理科生童鞋们是否如此,长时间发现,我是这样的,喜欢逻辑性的东西, 不太喜欢死记硬背。最近看过篇文章《Javascript继承机制的设计思想》(原文地址),
原文写的很好,当中讲了Javascript的继承产生思路。
如下列举一下表过程:
1.1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,可以浏览网页了(无前段交互,无网页互动)。
2.工程师Brendan Eich负责开发这种新语言(使得浏览器可以与网页互动的网页页脚本语言)
3.在其他面向对象的语言的影响下,设计了继承机制(为了降低难度,没有引入“类”的概念,使用了概念有:构造器constructor,new)
4.为做好数据共享,增加了prototype。
说说继承,为了学习继承,编写了如下脚本
javascript中的数据继承是通过_proto_ chain来实现的
javascript中继承机制的实现:
“JavaScript中的原型(prototype)是和函数(function)紧密相连的,因为每个函数默认都会有一个属性叫prototype, 每一个通过函数和new操作符生成的对象都具有一个属性__proto__, 这个属性保存了创建它的构造函数的prototype属性的引用。这个__proto__对象就是实现原型链的核心对象。JavaScript是一门面向对象的编程语言,它的继承特性其实就是通过原型链机制来实现的。同时,instanceof运算符也需要在原型链的支持。”
写了一段代码如下:
<script> function Person(name){ this.name = namel; } alert(Person instanceof Object);//true //方式一 Person.prototype.species = "ABC"; Person.prototype.DoHardWork = function () { alert(this.species); } //方式二:两种方式等价,但有区别 Person.prototype = { species: "ABC", DoHardWork: function () { alert(this.species) } };//相当于 Person.prototype = new Object({……});所以,Person.prototype.constructor === Object; Person.prototype.constructor = Person;//有利溯源查看Person这个原型, var father = new Person("张三");//father 中有 __propotype__属性,指向了Person.prototype; var uncle = new person("张四"); var Son = function (name) { this.name = name; }; Son.prototype = father; son.prototype.constructor = Son; var son1 = new Son("张小三");//son1中__propotype__指向了father,father 中有 __propotype__属性,指向了Person.prototype; /* 查看Son: son1.constructor; 查看Person:son1.constructor.prototype.constructor,//如果没有 Person.prototype.constructor = Person;这句话,就不能获取到Person 通过new生成的对象的Constructor找构造对象,通过构造对象(也是函数)获取继承的Prototype对象,通过Prototype对象的Constructor获取原函数。 */ </script>