`
wangchenggong1988
  • 浏览: 812 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

在没有类的情况下,JavaScript如何创建对象、实现继承?

阅读更多
      首先,我们有必要了解一下JavaScript在设计时为何没有类的概念。

我参考阅读了 两篇博文:

1.《JavaScript继承机制的设计思想  》http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

2.《理解JavaScript面向对象的思路》http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html

了解到94年网景公司(Netscape)在发布了浏览器的某一个版本后,出现了一个问题:表单的验证是由服务器来完成了,很消耗资源。因而急需一种浏览器脚本语言,能跟网页互动,在用户端就能做一些简单的表单验证,从而分担服务器的压力。这个任务交给了工程师Brendan Eich。当时面向对象程序设计语言(C++和Java)方兴未艾,他受其影响使JavaScript也面向了对象并引入了new操作符和构造函数。但他没有引入类的概念,因为那样一来,JavaScript就成为完整的面向对象编程语言了,就不简单易学了,而是引入了prototype(“原型”的意思)。



    具体的实现方式在对象创建时,在创建对象时new后跟的是构造函数(而不是类),同时为每个对象规定一个私有属性[[prototype]],并使其指向构造函数的prototype属性所指向的对象,即原型对象。当读取一个对象的属性时,如果对象本身没有这个属性,会尝试访问原型对象的相应属性。具体实现中,[[prototype]]所指向的对象仍然可以有[[prototype]],实际的访问就是一个链式的操作,直到找到这个属性或者[[prototype]]为空为止,所以常常听到原型链的说法,JavaScript主要就是通过它来实现继承的。为了防止[[prototype]]出现循环,JS引擎会在任何对象的[[prototype]]属性被修改时检查。按照标准,这个[[prototype]]语言使用者是无法访问的,不过FireFox的JS引擎把[[prototype]]暴露出来,作为公有属性"__proto__"。另外,为了类型识别,对构造函数(其实不仅限于构造函数,而是对所有的函数)规定了prototype属性(不同于对象,函数的prototype属性可以直接访问),指向原型对象,而所有的原型对象都会在创建一个新函数时自动获得一个constructor属性,它默认指向构造函数。



      总结一下,实例、原型对象、构造函数三者之间的关系。那就是:

1.每个构造函数都有一个指向原型对象的指针(prototype属性);

2.每个原型对象都有一个指向构造函数的指针(constructor属性);

3.每个实例(对象)都有一个指向原型对象的内部指针([[prototype]])。



下面探讨JavaScript中对象的创建。创建对象所采用的模式越来越好。

1.采用new Object()或对象字面量的模式创建对象。-----弊端:会产生大量重复的代码。

2.采用工厂模式。解决了创建多个相似对象的问题。----弊端:无法解决对象识别问题。

3.采用构造函数模式。解决了对象识别的问题-----弊端:同种引用类型的方法不能共享。

4.采用原型模式。实现了同种类型的属性共享。----弊端:当属性值本身又是引用类型时,共享时,不同的实例都持有同一份引用,都能对其操作,这样的属性不方便。

5.组合使用构造函数模式和原型模式。将公用的属性、方法放在原型对象里定义,将个性化的属性、方法放在构造函数里定义,从而最大限度地节省内存。



最后探讨JavaScript中的继承机制。实现继承所采用的范式也是越来越好。

1.原型链。重写原型对象,使其具有一个内部指针指向另一个类型的原型对象,从而实现继承。----弊端:当原型对象中包含有引用类型的属性值时,不方便(其弊端类似于创建对象时的模式4)。

2.组合继承。借用构造函数与原型链相结合。----弊端:两次调用了父类型的构造函数。

3.寄生组合式继承。采用寄生式继承的模式,使子类型的原型对象具有一个指向父类型原型对象的内部指针(这就是所谓的寄生),另外,在子类的构造函数中借用父类型的构造函数。这是开发人员普遍认为最理想的继承范式。









分享到:
评论

相关推荐

    javascript 原生态js类继承实现的方式

    在传统面向对象的语言中,有两个非常重要的概念 - 类和实例。 类定义了一类事物公共的行为和方法;而实例则是类的一个具体实现。 我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在...

    javaScript面向对象继承方法经典实现.docx

    javaScript面向对象继承方法经典实现.docx

    Javascript编程 类的继承及封装:Class

    笔者历经多年javascript的开发,痛彻体会javascript面向对象编程的不便性,精心制作了一个类的定义与继承功能的js,实现了在javascript中对类的定义、继承、封装机制,主要功能特征包括:  一、 统一了类定义的语法...

    JavaScript面向对象编程指南

    如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。, 《JavaScript面向对象编程指南》着重介绍...

    学习javascript面向对象 javascript实现继承的方式

    本文实例为大家介绍了javascript实现继承的6种方式,分享给大家供大家参考,具体内容如下 1、【原型链继承】实现的本质是重写原型对象,代之以一个新类型的实例。实际上不是SubType的原型的constructor属性被重写了...

    JavaScript面向对象编程指南.pdf

    如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。 《JavaScript面向对象编程指南》着重介绍...

    Javascript面向对象特性实现(封装、继承、接口).doc

    Javascript面向对象特性实现(封装、继承、接口 Javascript面向对象特性实现(封装、继承、接口

    javascript面向对象编程

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

    javascript使用Blob对象实现的下载文件操作示例

    本文实例讲述了javascript使用Blob对象实现的下载文件操作。分享给大家供大家参考,具体如下: Blob对象 前言 环境 操作 总结 Blob是一个类文件的不可变的原始数据对象,非javascript原生数据类型,File对象...

    浅析JavaScript实现基于原型对象的“继承”.pdf

    浅析JavaScript实现基于原型对象的“继承”.pdf

    javascript创建对象、对象继承的实用方式详解

    JavaScript中的对象是基于原型的。原型是对象的基础,它定义并实现了一个新对象所必须包含的成员列表,并被所有同类对象实例所共享。...本文着重给大家介绍javascript创建对象、对象继承的实用方式

    Javascript中对象继承的实现小例

    主要介绍了Javascript中对象继承的实现,需要的朋友可以参考下

    JavaScript程序设计课件:面向对象概述.pptx

    JavaScript程序设计 面向过程与面向对象 6.1.1 面向过程与面向对象 1、概念 面向过程(Procedure Oriented)也可称之为“面向记录”,是一种以过程为中心的编程思想。它注重的是具体的步骤,只有按照步骤一步一步...

    javascript面向对象之Javascript 继承

    上几节讲了 JavaScript 面向对象之命名空间 、 javascript 面向对象的JavaScript类 、 JavaScript 面向对象的之私有成员和公开成员 与 Javascript 面向对象之重载,大家可以先看上面的再继续往下看。在JavaScript...

    javascript面向对象学习笔记

    javascript面向对象学习笔记,包含类、对象、实现继承

    讲解JavaScript的面向对象的编程

    本人在带学生使用EXT框架时,我发现学生阅读Ext的sample代码有问题,特别是对JavaScript的面向对象编程的书写方式不熟悉,于是,写了四个sample来说明它现代JS编程的对类的定义方式、类继承的方式,以及怎样发展到...

Global site tag (gtag.js) - Google Analytics