您的位置:首页 > Web前端 > JavaScript

JavaScript原型链(Prototype)的设计思想

2014-02-13 10:47 309 查看
对于Java语言开发者来说,“对象继承、父类子类、类和实例”根深蒂固,理解Javascript语言的继承机制,难免会“转不过弯来”。阅读和引用了一些大师们的文章,自我总结一下Javascript为什么设计成“原型链”的模式?

首先从诞生说起,1994年网景公司(Netscape)发布了Navigator浏览器0.9版,为了让浏览器可以与网页互动,工程师Brendan Eich负责开发这种语言,即最初的Javascript。C++是当时最流行的语言,而Java语言也开始风生水起,因此设计者Brendan Eich受到了极大的影响:“Javascript里面所有的数据类型都是对象(object)”!接下来,如何把对象连接起来就要考虑“继承”了,可能是Brendan Eich考虑到不想把javascript搞得那么复杂(满足基本交互应用即可,或者为了降低初学者难度),或者认为不引入“Class”依然可以设计出更巧妙的模式来,总之,他没有设计“类Class”的概念。

还是从面向对象的思想来设计JavaScript语言。Java里从原型对象生成一个实例对象:Animal dog = new Animal();因而Brendan Eich使用了new关键字;接下来java里new时会调用“构造函数constructor”,在Javascript里是这样设计的,new命令后面跟的不是类,而是“构造函数”,举例来说:function Animal(name){ this.name=name; },把这个函数对象当成“构造函数”,var dog = new Animal("dog"); alert(dog.name);构造函数中的this关键字,代表了新创建的实例对象。还可以再建一个实例,var cat = new Animal("cat");alert(cat.name),实际上原型对象应该有共性的属性或方法,例如:function Animal(name){ this.name=name; this.need="air";},此时修改实例对象dog.need="eat";并不会影cat.need;而need是Animal的公共属性,需要资源保护,不能资源浪费。所以,Brendan Eich决定为构造函数设置一个prototype属性,解决这个问题。

所有需要共享的属性或方法都放在prototype属性对象里,其他放在构造函数里。实例对象一旦创建,将自动引用prototype对象的属性和方法。Animal.prototype={need:"air"};alert(dog.need);由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: