`
zhangyaochun
  • 浏览: 2553144 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    讲解JavaScript的面向对象的编程

    -目的说明它是在第1,2阶段文档演示的JavaScript面向对象的书写方式的进一步改进,它是现代JavaScript面向对象编程方式(使用基本类来编码)的过渡代码--没有它就没有当今的JS OOP--此人非常牛!!! 4. 最后使用IE...

    面向对象javascript

    面向对象的javascript教程,介绍javascript面向对象的方法,包括继承,多态等。

    Javascript OOP之面向对象

    面向对象程序设计(Object-oriented programming,OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和...

    JS封装和继承-入门级

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。

    JavaScript面向对象编程指南

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

    深入理解JavaScript系列(17):面向对象编程之概论详细介绍

    特别是,我们会考虑对象的创建算法,对象(包括基本关系 – 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义)。 英文原文:...

    POO-Basico-Platzi:t Platzi OOP课程中的笔记和练习的发展:green_heart:

    Platzi面向对象编程课程 为什么要学习面向对象的编程? 因为它允许更快的编程,所以这是由于对所执行的操作进行了事先分析。 知道如何分析问题和理解面向对象的编程可以前进并停止成为初级程序员。 这是因为招聘...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言...

    2014年辛星PHP教程秋季版之OOP与MVC.pdf

    比如 python 中函数和变量也都是对象, Javascript 中有很多的伪对象,Java 则是完全的面向对象,而 Java 和 PHP 等语言都只能使用单继承,而 C++则使用令人头疼的多继承、 虚函数、友元等等一些复杂的概念,导致了...

    javascript基于prototype实现类似OOP继承的方法

    主要介绍了javascript基于prototype实现类似OOP继承的方法,实例分析了JavaScript使用prototype实现面向对象程序设计的中类继承的相关技巧,需要的朋友可以参考下

    【独家】【笔面试知识要点】16.OOP与OBP构造函数静态块1

    76.面向对象的编程语言和基于对象的编程语言之间有什么区别?基于对象的编程语言遵循OOP的所有功能(继承除外)。JavaScript是基于对象的编程语言的示例。

    JS继承与闭包及JS实现继承的三种方式

    在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 、 成员属性、静态属性、原型属性与JS原型链)。今天我们来继续探讨剩余的内容吧。 我们都知道,面向对象的三大...

    VanillaJS-Object-Oriented-Notes:有关JS ES6的面向对象的注释

    目录教程1 ES5构造函数,定义一个对象。教程2 将其他类型定义为对象。教程3 创建原型并向对象添加其他功能。教程4 使用Object.create()方法和... 清除oop代码,super()方法,并扩展为从另一个类继承到该类。

    JavaScript面向对象的程序设计(犯迷糊的小羊)

    本章开始进入JavaScript核心知识点的高级部分——面向对象的程序设计,这一部分的内容将会对对象这一数据类型做进一步的深化理解,并且讲述几种创建对象的设计模式以及JavaScript独特的继承机制; 1.理解对象和面向...

    JS面向对象编程基础篇(一) 对象和构造函数实例详解

    本文实例讲述了JS面向对象编程对象和构造函数。分享给大家供大家参考,具体如下: 面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,...

    Object-Oriented-Programming:Muzaffer Arda Uslu 创建的 C++ 面向对象编程

    OOP 是面向对象编程的简称,是 1960 年代后期出现的一种方法,旨在消除编写代码的复杂性并消除代码重复。 第一个 OOP 语言是 。 我们可以假设,流行的OOP语言是C ++,C#,Java,PHP,Python和JavaScript。面向对象...

    一个完全实现OOP编程的JS库

    Klass是一种代码结构,是传统OO语言实现的Class;JsKlass是基于JS实现的OOP代码结构,具有类、继承、接口、常量、静态、prototype支持、安全机制等功能特征;请到官方下载最新版本库,site: www.jsklass.com

    Reflection-in-OOP

    ## Your Challenge Reflection是面向对象语言中的通用实用程序,用于检查类并派生有关其公开的属性/方法以及它们从其继承的其他类的信息。 今天我们将编写我们自己JavaScript反射器! 我们将编写一个简单的实用程序...

Global site tag (gtag.js) - Google Analytics