`

javascript之面向对象编程之原型继承

阅读更多
前文讲到“属性继承”所存在的问题:重复。本文专注于“原型(prototype)继承”。

背景知识:什么是函数的 prototype 属性?

函数在定义(创建)时,会自动被添加一个 prototype 属性。

  1、prototype 属性是一个空对象 {},然后被添加了一个 constructor 属性,指向函数自身。
  2、prototype 属性被函数(使用 new 操作符生成)的实例共享。
  3、在访问函数实例的某个属性时,如果该属性不存在,则向其 __proto__ 属性中寻找,如果仍然不存在则向其 __proto__ 属性的 __proto__属性中寻找,直至根。

//

function F(){}

//test
console.log(F == F.prototype.constructor); // true

//


//

function F(){}
F.prototype.title = "hello";

//test
var f1 = new F();
var f2 = new F();

console.log(f1.title); // hello
console.log(f2.title); // hello

//


再补充一句:constructor 的意义?
由于
       1) constructor 属性,指向函数自身。
       2) prototype 属性被函数的实例共享。
       3) constructor 属性是 prototype 的一部分。

所以函数的各个实例便可以通过 constructor 属性确定,它们来自于同一个构造函数。



一、继承其它函数的 prototype 属性

    函数 A(即将要被创建)的 prototype 属性是空的,未被使用的。
    函数 B 的 prototype 属性将被函数 A 继承。

    有以下方案:

    1、直接引用函数 B 的 prototype 对象作为函数 A 的 prototype 对象

    function Animal(){}

    function Dog(){};    
    Dog.prototype = Animal.prototype;
    
    
    //test
    var dog = new Dog();
    console.log(dog.constructor == Dog );   // false

    问题:
    1) 如果函数 A 修改 prototype 对象,会直接影响到函数 B。
       如果函数 B 的 prototype 属性又被函数 C 引用,则会出现修改冲突和混乱。
    2) 函数 A 的与函数 B 共享一个 prototype ,共享一个 prototype.constructor
    这显然不对。



    2、new 一个其它函数的实例,把它赋值给新函数的 prototype 属性
    函数的 prototype 属性不就是一个对象吗(虽然具有特定的 constructor 属性)?
    那我们给它一个好了。
//
    
    function Animal(){}
    Animal.prototype.type = "Animal";

    function Dog(){};
    
    
    //1. var dog_constructor = Dog.prototype.constructor;    
    //2. Dog.prototype = new Animal();
    //3. Dog.prototype.constructor = dog_constructor;    
    //4. dog_constructor == Dog // true
    
    var animal = new Animal();

    Dog.prototype = animal;
    Dog.prototype.constructor = Dog;
    
    
    
    //test
    var dog = new Dog();
    console.log(dog.constructor == Dog );   // true
    console.log(dog.type == "Animal" );     // true

//


    问题:
    1) 我们只是关心继承其它函数的 prototype 属性,而非this属性。
    当使用 new 操作符时,无疑增加了不必要的原函数的 this 属性。

    注意:
    1) 新生成的其它函数的实例,没有 constructor 属性(虽然其 __proto__ 中有),
    但这不是我们想要的。正好手动为其添加一个 constructor 属性,指向新函数自身。
   
   
    3、“方法 2”的扩展
    方法 2 在功能上已经实现了我们想要的。只是多了不必要的父类中this对象中的属性。
    那好,只需去掉 this 对象(或只抽取其 prototype 对象)即可。
   
//
    function Animal(){}
    function Dog(){};
    
    Animal.prototype.type = "Animal";
    
    function F(){};
    F.prototype = Animal.prototype;
    
    Dog.prototype = new F();
    Dog.prototype.constructor = Dog;
    
      
    //test
    var dog = new Dog();
    console.log(dog.constructor == Dog );   // true
    console.log(dog.type == "Animal" );     // true
//

借助于空函数 F(){} 和修改 F 的 prototype,
我们构造了一个只含有 Animal 的 prototype 属性的“简洁的 Animal”:F 。


将上述方法封装为一个函数:

     Function.prototype.extendPrototypeFrom = function(Parent){
        var constructor = this.prototype.constructor;
        function F (){};
        F.prototype = Parent.prototype;
        this.prototype = new F();
        this.prototype.constructor = constructor;    
    }


    //test
    
    function Animal(){}
    function Dog(){};    
    Animal.prototype.type = "Animal"; 
    
    Dog.extendPrototypeFrom(Animal);
    
    //test
    var dog = new Dog();
    console.log(dog.constructor == Dog );   // true
    console.log(dog.type == "Animal" );     // true




结语:

原型继承又叫方法函数继承。
因为我们通常把有用的方法写到函数的 prototype 属性中。

属性继承又叫this属性继承。
它主要是通过传递this的引用给其它函数,而使this具有额外的属性。



—————————————

javascript 函数基础系列文章

1、JavaScript之变量的作用域
2、javascript之变量类型与变量声明及函数变量的运行机制
3、javaScript之function定义
4、javascript之function的prototype对象
5、javascript之function的(closure)闭包特性
6、javascript之function的this   
7、javascript之function的apply(), call()



___________


javascript 面向对象编程系列文章:

    1、javaScript之面向对象编程
    2、javascript之面向对象编程之属性继承
    3、javascript之面向对象编程之原型继承 
   

-


-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2348442





-



分享到:
评论

相关推荐

    Javascript面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的..., 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库。

    JavaScript面向对象编程指南.pdf

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

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

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    javascript面向对象编程

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

    javascript面向对象编程.pdf

    总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...

    第15章 javascript面向对象与原型

    在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...

    JavaScript面向对象编程指南 pdf

    下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...

    JavaScript学习深入—面向对象编程

    ### JavaScript学习深入—面向对象编程 #### 一、JavaScript中的类型概述 ...综上所述,JavaScript通过其灵活的类型系统和原型继承机制支持面向对象编程,这为开发者提供了强大的工具来构建复杂的应用程序。

    JavaScript面向对象程序设计

    在JavaScript面向对象编程中,随着Web2.0和Ajax技术的普及,JavaScript的角色从简单的表单验证扩展到了复杂的数据交互和页面动态更新。采用面向对象的编程风格可以使代码结构更加清晰,便于管理和维护。例如,...

    JAVASCRIPT 面向对象编程精要

    本文介绍了JavaScript面向对象编程的基本概念和技术细节,包括变量和对象的基础用法、函数的作用以及如何通过封装和继承来构建复杂的对象层次结构。JavaScript的独特之处在于它的灵活性和动态性,这使得它成为了一种...

    面向对象JavaScript精要(英文原版pdf)

    Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的基本原理以及如何将这些原理应用于JavaScript中。 #### 二、面向对象编程基础 面向对象编程...

    javascript 经典面向对象设计

    标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及库。描述中提到本书相比其他中文资料更为清晰,深入到...

    JavaScript 面向对象与原型

    以下是对JavaScript面向对象和原型机制的详细解释: 1. 面向对象的基本概念: - 类:在许多面向对象语言中,类是创建对象的模板,但在JavaScript中没有类的概念。 - 对象:JavaScript中的对象是一组键值对,可以...

    JavaScript面向对象编程指南 第2版 高清 带索引书签目录_样章.pdf

    首先,该文件提到的书籍是关于JavaScript面向对象编程的,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据(以字段的形式)以及代码(以方法的...

    JavaScript面向对象编程案例

    `JavaScript面向对象编程讲解.pptx`可能提供了更详细的理论解释和更多示例,帮助读者深入理解面向对象编程在JavaScript中的应用。 学习JavaScript面向对象编程,不仅有助于理解代码的结构和复用性,还有助于提高...

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

    总的来说,JavaScript的面向对象编程依赖于对象、原型和继承来实现类的功能。通过理解和熟练运用这些概念,开发者可以在JavaScript中构建复杂、可维护的系统,同时避免命名冲突问题。虽然JavaScript的面向对象模型与...

Global site tag (gtag.js) - Google Analytics