`
zhangyaochun
  • 浏览: 2613272 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

js--面向对象OOP之继承

阅读更多

一直反复地再研究这个东西,还是简单地记录一下。

 

其实很多面向对象的语言必须支持继承机制。即一个类能够重用(继承)另一个类的方法和属性。这样的话就会有一个“基类

注意:一般出于安全,本地类和宿主类不能作为基类

 

创建的子类将会继承基类的所有属性和方法,包括构造函数和方法的实现。这些属性和方法多少公用的,子类还可以添加基类中没有的新的私有的属性和方法,当然也可以覆盖基类中的属性和方法。

 

关于继承的方式很多比如:call,apply,还有“对象冒充”,prototype,"混合模式"等等。

 

 

//父类
function People(){
   this.species ="人类";
}

 

 

 

//it子类
function ITDesigner(name,age){
     this.name = name;
     this.age = age;
}

 

 1.我用apply处理

 

ps:apply和call的区别其实很简单:apply的第二个参数必须是参数的数组,call的是可以是字符串,也可以是多个

 

function ITDesigner(name,age){
    //在子类内部调用apply
   People.apply(this,arguments);
   this.name = name;
   this.age = age;
}

 

var zhang = new ITDesigner("zhang",24);console.log(zhang.species); //人类
 

2.再用prototype处理

 

  验证:ITDesigner.prototype = People.prototype; //2012-12-4 发现单纯采用这样方式,继承无效!!!!!!!!!!!

 

 

//先来看一种不合适的处理方式
//它的缺点就是会改变父类的constructor
//什么是constructor----prototype对象多有constructor属性,指向它的构造函数
ITDesigner.prototype = People.prototype;
ITDesigner.prototype.constructor = ITDesigner;
var zhang1 = new ITDesigner("zhang1",24);
console.log(zhang1.species);           //人类
//注意这里
console.log(People.prototype.constructor); //ITDesigner 

 ps:当然如果你把

 

//ITDesigner.prototype = People.prototype
//换成实例化
ITDesigner.prototype = new People();
//没有变构造函数哦
console.log(People.prototype.constructor) //People

 3.试试封装函数

 

//思路还是定义一个空对象做中介
//至少空对象比实例化对内存上友好一点

//参数说明
//Child---子类名
//Parent ---父类名
function extend(Child,Parent){
      var D = function(){};
      D.prototype = Parent.prototype;
      Child.prototype = new D();
      Child.prototype.constructor = Child;
}

//调用
extend(ITDesigner,People);
var zhang2 = new ITDesigner("zhang2",24);
console.log(zhang2.species);     //人类
console.log(People.prototype.constructor); //People

 ps:是不是有点YUI的影子

 

前段由于工作需要,一种在研究tangram,其实里面的fx部分也有定义基类

 

放一个自己的脚本库的object API

 

/*
*extend-copy the source's properties into target*
*@function*
*@param {Object} target*
*@param {Object} source*
*@return {Object}*
*@remark--it will cover the target's properties when the key is same in source*
*source's prototype is not copy*
*/
ZYC.object.extend = function(target,source){
    for(var key in source){
       if(source.hasOwnProperty(key)){
	      target[key] = source[key];
	   }
	}
	return target;
};

 

ps:我的object的脚本库的extend是用的hasOwnPrototype,所以原型链的属性是不支持复制的,如果你有需求可以改成in,如下方:

 

 

 看到这个你是不是想,上面的继承的extend还可以这样写

 

//重写的
function extend(Child,Parent){
    var Cp =Child.prototype; 
    var Pp =Parent.prototype;
    for(var i in Pp){
        Cp[i] = Pp[i];
   }  
}

 ps:这里的in是不区分本地私有属性和原型链上的公用属性

2
0
分享到:
评论

相关推荐

    Javascript 面向对象的JavaScript进阶

    ### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...

    js 面向对象实例

    在JavaScript面向对象的上下文中,我们可以创建专门处理Canvas绘图的类,封装复杂的绘图逻辑: ```javascript class Circle { constructor(x, y, radius) { this.x = x; this.y = y; this.radius = radius; } ...

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它将数据和处理数据的方法绑定在一起,形成一个整体——对象。OOP 的主要特征包括封装、继承和多态。 1. **封装**:封装是将数据和操作数据的...

    Javascript面向对象基础.rar

    在这个“JavaScript面向对象基础”的资料中,我们将会探讨JavaScript中的类、对象、封装、继承以及多态等关键概念。 1. **对象与对象字面量** 在JavaScript中,对象是由键值对组成的无序集合,可以使用对象字面量...

    worldwindjava源码-javascript-oop:面向对象编程和面向对象JavaScript

    中的面向对象编程 学习目标 使用构造函数生成特定类型的对象。 使用构造函数将属性附加到新对象。 回想一下在构造函数中定义方法的成本。 通过将自定义对象附加到原型来定义自定义对象的方法。 使用 ES6 类语法重构...

    Javascript面向对象编程.

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

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

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

    js-oop.rar_control

    **JavaScript面向对象编程(JS OOP)** JavaScript 面向对象编程(Object-Oriented Programming,简称 OOP)是 JavaScript 语言中的一个重要概念,它允许开发者创建复杂、可复用的代码结构。在 "js-oop.rar_control...

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

    虽然JavaScript本身并不是一种传统的面向对象语言,但它通过原型继承机制支持OOP。每个对象都有一个原型,原型可以是一个对象,也可以是一个构造函数。通过这种方式,JavaScript支持继承、封装和多态等面向对象编程...

    JavaScript面向对象继承详解

    本文将深入探讨JavaScript中的面向对象继承,这是理解JavaScript OOP的关键部分。 面向对象继承是实现代码复用和模块化的重要机制。在JavaScript中,继承主要通过原型链(Prototype Chain)实现。每个JavaScript...

    wksp-module-2-js-8-oop

    综上所述,"wksp-module-2-js-8-oop"的学习资源可能包含了JS面向对象的全面教程,从基本的类、对象到高级的继承、封装和多态性,旨在帮助开发者深入理解并熟练运用JavaScript的面向对象编程技术。通过这些知识,...

    javascript面向对象编程(中文).pdf

    ### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...

    Javascript OOP之面向对象

    在深入探讨JavaScript面向对象编程(OOP)之前,首先需要明确的是,JavaScript是一种基于对象的语言,意味着你几乎可以在任何你遇到的上下文中操作对象。然而,需要注意的是,JavaScript在最初设计时并没有包含传统...

    js 贪吃蛇(面向对象)

    总结来说,"js 贪吃蛇(面向对象)"案例提供了学习和实践JavaScript面向对象编程的好机会。通过分析和实现这个案例,开发者可以深入理解面向对象的设计原则,提高代码复用和维护性,同时也能体会到面向对象编程在...

    Javascript oop设计模式 面向对象编程简单实例介绍

    JavaScript中的面向对象编程(OOP)是一种强大的编程范式,它允许我们以更接近现实世界的方式来组织代码。在JavaScript中,我们通常通过构造函数、原型和封装等概念来实现OOP。 首先,让我们看下传统的JavaScript...

    网上书店运营系统-北京大学面向对象概论课程大作业

    **面向对象编程(Object-Oriented Programming, OOP)**是一种流行的编程范式,它以对象为中心,通过封装、继承和多态性等核心概念来设计和组织代码。在“网上书店运营系统”中,可以将各个组成部分如用户、书籍、...

    02-js面向对象考核-tab栏案例.zip

    在这个"02-js面向对象考核-tab栏案例"中,我们可以深入探讨JavaScript面向对象编程在实际项目中的应用,尤其是如何使用它来实现tab栏切换功能。 首先,让我们理解面向对象的基本概念。在JavaScript中,对象是键值对...

    004课-js面向对象.rar

    在本课程“004课-js面向对象”中,我们将深入探讨JavaScript中的面向对象编程(Object-Oriented Programming, OOP)概念。 一、面向对象编程基础 面向对象编程是程序设计的一种结构化方法,通过模拟现实世界中的...

Global site tag (gtag.js) - Google Analytics