`
wsql
  • 浏览: 11774568 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

JavaScript学习总结三:js基于原型面向对象

 
阅读更多

JavaScript原型概念说不好理解其实没那么难,说好理解其实也没那么简单,关键是你有没有找到一个合适自己的理解方法。

预备知识:

我想研究js原型的人肯定对js有一定了解,所以基础的知识不再赘述。但是我还要强调一些变态的知识点:

l JavaScript没有类的概念,是基于原型的面向对象。

l function这个关键字一定要理解正确!这不是传统意义上的定义函数的关键字,而是类!一定要把function理解成类!所以,在function a(){}时,其实你是在创建一个functio的实例,a不是函数,而是对象!这正好符合一句真理:“一切皆对象”。

l new关键字也不是传统的new。后边加的是对象,而不是类。

l JavaScript中没有方法,只有属性。

l .表示访问(获取成员属性),()表示执行。比如fun.x()可以理解为:fun这个对象访问了x属性,并执行这个属性。

概念描述(部分内容来自于网络):

在说原型之前,还要先说点别的知识。上边提到function实际上是在创建对象,这时候它充当了两个角色:创建对象、构造函数。JavaScript就是这么规定的,所有的对象在创建时都要有构造函数。还有需要注意的就是new关键字后边接的全是对象,并不是类,new的功能和传统的语言也不一样,因为JavaScript是基于原型的,没有类,所以new不可能完成传统new的功能,那它做什么了呢?我就简单的说一句:new其实就实现了原型机制(具体怎么做的网上资料有的是)。

究竟什么是原型,下边是来自网络的一段话:

“javascript原型是一个对象。 javascript中所有的构造函数都有一个属性,叫prototype,这个属性存放的就是原型对象;访问这个属性通过:函数名.prototype ,从而可以访问到这个原型对象,也可以为这个原型赋值。在原型对象中有一个属性叫constructor,这个constructor指向函数本身。我们可以访问到原型中的这个属性:函数名.prototype.constructor;我们可以为原型对象添加属性并赋值:函数名.prototype.属性名=值;为函数原型添加的属性,都会成为构造函数的属性,从而成为对象的属性。既然对象具有了原型内的属性,说明对象中的这些属性是从原型中继承来的。所以javascript是基于原型的继承的。”

其实原型就是对象的prototype属性指向的对象。对象通过prototype属性继承了“父类”的特性,甚至包括构造函数在内。证明继承了构造函数的例子:

<script type="text/javascript">
	function fun1(){alert("我爱中国");}//fun1的构造函数
	fun2 = new fun1();//通过fun1创建fun2
	fun3 = new fun2();//我们并没有定义fun2的构造函数,但是成功的创建了fun3,说明构造方法也会继承
	fun3();//输出“我爱中国”
</script>

现在再回过头来看new和function,我们可以通过function和new两种方式创建对象,但两者都要求必须有构造函数,只不过function同时承担了创建对象和构造函数两个职责,而new却要找“父类”的构造函数(系统内部的对象比如Array也有构造函数,这样我们才可以顺利的new,只不过隐藏了)。此时,应该不难理解new实际上是把“父类”作为原型给“子类”的prototype属性。而function是新建,以自己为原型给自己的prototype属性。

这差不多就是JavaScript的原型继承机制了!继续深入,上文提到JavaScript没有方法,只有属性。实际上所有的对象都可以理解为一个属性包,或者说散列数组(key,value),对象只有访问成员的操作。通过“.”指定要访问的属性,通过“()”执行属性(可以理解为方法),JavaScript并不管我们要执行的属性是什么,只负责通过key(属性名)找到相应的value(属性值),所以对象的属性值可以是对象,也可以是数值,是对象的话我们可以用“()”执行,是数值型的话就直接“.”+属性名访问。

原型链:

我们可以自行更改prototype属性,也就是自行设置对象的原型对象。同时,原型继承是链式的。比如,b继承了a,c又继承了b,那么c也继承了a,这样就构成了原型链。原型链的特性是:读的时候从原型链上读,写的时候向自己里面写。大致意思就是:在刚刚abc的例子中,如果在c中访问了一个属性,但是c中没有,会自动去b、a中寻找;但是如果向c中添加属性,那么就直接写在c中。

示例代码:

<script type="text/javascript">
	function fun1(){}//创建fun1对象,原型为自身
	function fun2(){}//创建fun2对象,原型为自身
	fun1.prototype = new Object();//设对象fun1的原型为最底层的系统的Object对象
	fun2.prototype = new fun1();//设对象fun2的原型为fun1
	Object.prototype.a="a";//给对象Object的原型添加一个数值型a属性
	fun = new fun2();//创建一个fun2的对象,继承fun2的所有属性
	alert(fun.a);//调用fun2继承来的a属性,实际上调用的Object原型中的a。打印出“a”
	fun1.prototype.a = "a1";//给fun1的原型(即Object)对象添加一个数值型a属性
	alert(fun.a);//调用fun2继承来的a属性,实际上调用的fun1原型(即Object)中的a。打印出“a1”
</script>

图解:




分享到:
评论

相关推荐

    JavaScript面向对象编程指南

    资源名称:JavaScript面向对象编程指南内容简介: Javascript是一种具有高度表达能力的、基于原型特性的、非常灵活的面向对象编程语言。《Javascript面向对象编程指南》着重介绍Javascript在面向...

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript 面向对象编程详细讲解文档

    原型是理解继承概念的关键, 我们将会教你如何建立原型, 如何检测一个对象是否是另外一个对象的原型, 及其 JavaScript 的模型与Java 面向对象编程之间的区别。我们同样会向你展示如何检测对象所包含的各种属性的方法...

    javascript面向对象编程

    面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...

    第15章 javascript面向对象与原型

    李炎恢JavaScript视频教程[Avi版]中的讲义 非常好~

    深入理解JavaScript系列

    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 深入理解JavaScript系列(21):S.O.L....

    深入理解JavaScript系列(.chm)

    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗 》答案详解 深入理解JavaScript系列(21):S O L I...

    JS面向对象经典案例

    JS面向对象经典案例,JS面向对象过程中用到的一些技术,例如对象、类、JS继承Call、JS原型链Prototype、JS闭包等等

    Javascript面向对象程序设计培训讲义

    由于JS不是纯的面向对象的语言,所以对象的继承是以原型函数的形式继承的,很多人刚开始接触的时候不太理解,但是JS这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能...

    Javascript 面向对象编程

    但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么...

    JavaScript核心(对象、原型、继承、上下文、闭包、this).pdf

    面向对象概念(对象封装,各种继承,闭包原理,this作用域等)介绍清晰易懂

    JavaScript面向对象基础PPT

    JavaScript面向对象基础PPT,讲述了何谓面向对象、面向对象特点、组成及写法、工厂模式、原型以及如何将普通面向过程的代码转换为面向对象的基本原则

    JavaScript面向对象编程指南(第2版)

    , 内容提要, JavaScript语言是一种具有高度表达能力的、基于原型特性的、非常灵活的面向对象程序设计语言。本书着重于介绍JavaScript在面向对象方面的特性,以为您展示如何去构建强健的、可维护的、功能强大的应用...

    JavaScript你一定要搞懂的原型链

    通过掌握原型链的概念和工作原理,开发者可以更好地利用 JavaScript 的面向对象特性。 这是一个可编辑的xmind文件,对原型链有清晰的勾画,不同的链用不同颜色进行了标识,内容一目了然,可以帮助快速学习原型链。

Global site tag (gtag.js) - Google Analytics