JavaScript中的的面向对象中的一些知识

JavaScript中的的面向对象中的一些知识

function Cat(name,age){return {name:name,age:age   }}
//构造函数
function Dog(name,age){this.name=name;this.age=age; }function show(){var c1=new Cat("cat1",18);var c2=new Cat("cat2",19);//Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。alert(c1 instanceof Cat); //falsealert(c2 instanceof Cat); //falsevar d1=new Dog("dog1",18);var d2=new Dog("dog2",19);alert(d1 instanceof Dog); //truealert(d2 instanceof Dog); //true }

构造函数方法很好用,但是存在一个浪费内存的问题。

所以就有了prototype对象了

    function Dog(name,age){this.name=name;this.age=age;    }Dog.prototype.type="Animal";//isPrototypeOf();某个prototype对象和某个实例之间的关系function show(){var dog=new Dog("yuanzhangliu",18);//alert(Dog.prototype.isPrototypeOf(dog));//true;//判断对象的实例时属于本地还是prototype对象的属性alert(dog.hasOwnProperty("name")); //truealert(dog.hasOwnProperty("type")); //false//那么我们的in运算符号可以判断,某个实例是否含有属性;不管本地还是prototype中滴alert("name" in dog); //truealert("type" in dog); //true//或者直接使用我们for循环来遍历滴呀for(var prop in dog){alert(prop);    }}

第二部分:构造函数之间的继承

call apply 实现继承

  function Animal(){this.species="Animal";  this.fun=function (){alert("eat");  }}function Dog(name,age){this.name=name;this.age=age;Animal.call(this);//Animal.call(this,arguments); 将Dog中的参数传递过去,//让它(arguments)中可以使用滴呀 具体的额,后面用到再呵呵呵
  }function show(){var d=new Dog("dog",12);alert(d.species);d.fun();}

prototype来是实现滴呀

  function Animal(){this.species="Animal";  this.fun=function (){alert("eat");  }}function Dog(name,age){this.name=name;this.age=age;}function show(){//第一步:Dog.prototype=new Animal();Dog.prototype.constructor=Dog; //这不还是很重要的//防止继承链的紊乱//再实际的开发中如果我们替换了原来函数对象的prototype//我们也该constructor,(正确的说叫还原constructor)//o.prototype={};//o.prototype.consturtor=ovar d=new Dog("yuanzhang.liu",18);d.fun();}

方法三

  function AnimalOld(){this.species="Animal";  this.fun=function (){alert("eat");  }}//将他改造成如下:function Animal(){}Animal.prototype.species="Animal";Animal.prototype.fun=function (){alert("eat");  }function Dog(name,age){this.name=name;this.age=age;}function show011(){//这样我们就省去了new Animal();Dog.prototype=Animal.prototype;Dog.prototype.constructor=Dog; //这句话也将我们Animal.prototype.constructor 改变了滴呀//解决方法就是利用空的对象做为介质滴呀var d=new Dog("yuanzhangliu",18);d.fun(); //这样我们的额Dog.prototype 和 Animal.prototype 就指向了同一个//对象,任何一个对象的修改,都会反映到另外一个对象上滴呀
  }function F(){}function show(){F.prototype=Animal.prototype;Dog.prototype=new F();Dog.prototype.constructor=Dog;var d=new Dog("yuanzhangliu",18);d.fun(); //这样我们的额Dog.prototype 和 Animal.prototype 就指向了同一个//对象,任何一个对象的修改,都会反映到另外一个对象上滴呀}

我们把上面的的方法总结和改进一下就可以提取出一个通用的方法滴呀

 function extend(Child,Parent){function Kong(){};Kong.prototype=Parent.prototype;Kong.prototype.constructor=Kong;Child.prototype=new Kong();Child.prototype.constructor=Child;}

 

方式四:我们可以通过拷贝的方式进行滴呀;

function Person(name,age){this.name=name;this.age=age;this.fun=function (){alert("fun"); }}Person.prototype.protoFun=function (){alert("prototypeInfo"); }function Dog(name,age){this.name=name;this.age=age;}//接下来,我们通过拷贝来实现继承id呀function extend2(Child,Parent){//同样的,使用这种方式实现继承滴呀;//父类的属性,必须设置在prototype上才被子类继承var p=Parent.prototype;var c=Child.prototype;for(var i in p){c[i]=p[i];//还要拷贝它的值滴呀;    
    }}function show(){extend2(Dog,Animal);var d=new Dog("yuanzhangliu",18);d.protoFun();d.fun();//无法调用滴呀   }

非构造函数的方式来实现继承继承滴呀

   //非构造函数的方式实现继承滴呀;var chinese={nation:'中国'};var Doctor={career:'医生'}//这两个都是普通的对象,不是构造函数,无法使用构造函数的方式来实现继承滴呀//将两个对象通过prototype链,连接在一在一起的呀;

实现方式

 function object(parent){function F(){//利用它的原型链,将他们连接在一起的滴呀
       }F.prototype=parent;var son=new F();return son;//这样就返回了父级对象滴呀
    }//使用的时候;var Chinese={nation:'中国'    }var Doctor=object(Chinese);Doctor.career='医生';alert(Doctor.nation);//原来尼玛,是这样写的滴呀;

还用一种方式:

    function extendCopy(parent){var c={}; //空对象介质;for(var i in parent){//循环遍历出它的属性的呀; 子对象获取的是父对象的一个内存地址c[i]=parent[i];   }return c;}//使用的时候;var Chinese={nation:'中国'    }var Doctor=extendCopy(Chinese);Doctor.career='医生';alert(Doctor.nation);

缺点:浅拷贝,子对象获取的是父对象的一个内存地址,当子对象改变的同时也就改变了父级对象滴呀

Chinese.birthPlaces=['日本','京都','大阪'];var Doctor=extendCopy(Chinese);Doctor.birthPlaces.push('眉山');alert(Chinese.birthPlaces);//父级的也被改变了
    alert(Doctor.birthPlaces);//他们的结果都是:'日本','京都','大阪','眉山'

 

既然有浅拷贝,当然就有我们的深拷滴呀

     function deepCopy(parent,son){var son=son || {};for(var i in parent){if(typeof parent[i]==='object'){son[i]=(parent[i].constructor===Array)?[]:{};//然后继续拷贝滴呀deepCopy(parent[i],son[i]);//进一步的遍历滴呀}else{son[i]=parent[i];    }}}//目前jquery 就使用的这种方式实现继承id呀

这样我们的面向对象的就算是....

 

转载于:https://www.cnblogs.com/mc67/p/5182247.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 发出异步的Get请求

下列的下载代码示例是 HttpClientSample。它以不同的方式异步调用Web 服务。为了演示本例使用的不同方法,使用了命令行参数。示例代码使用了以下名称空间:System System.Linq System.Net System.Net.Http System.Net.Http.Headers System.Threading Sy…

python用pandas读取excel_Python使用pandas读取Excel文件数据和预处理小案例

假设有Excel文件data.xlsx,其中内容为 现在需要将这个Excel文件中的数据读入pandas,并且在后续的处理中不关心ID列,还需要把sex列的female替换为1,把sex列的male替换为0。本文演示有关的几个操作。 (1)导入…

shader 3 rendering path

渲染通道, rendering path。 vertexlit, forward 和 Deferred lighting 旧有的非统一架构下: 分为顶点着色引擎和像素渲染通道 渲染通道是GPU负责给图像配色的专门通道; 越多,填充效率越高,流畅性越好。 ht…

《帝王三部曲》——二月河

前一段时间断断续续的在看二月河写的《帝王三部曲》中的《雍正王朝》。写的真棒!然后又迫不及待地去读远上搜索下载了三部曲全本,可惜,下载到现在一直未去看…… 生活总是这样,忙忙碌碌的……欲望太多。 希望自己以后做事情&#…

React Native之Props(属性)和State(状态)和简单样式简单使用

1 Props(属性)和State(状态)和简单样式简单使用App.js代码如下 /*** Sample React Native App* https://github.com/facebook/react-native** format* flow*/import React, {Component} from react; import {Platform, StyleSheet, Text, View, NativeModules, DeviceEvent…

解决SQL Server 2005数据库中datetime时间字段在前端显示时分秒的问题

SQL Server 2005中时间类型datetime的格式是“年月日时分秒”,直接读出来该字段,为了不让它在前端显示“时分秒”若是显示在dataGridView中,可以修改控件的某一列格式,如: dataGridView1.Columns[10].DefaultCellStyle.Format = "yyyy-MM-dd"; 但是要在listview…

config kubectl_Kubernetes(k8s)中文文档 kubectl config set-context_Kubernetes中文社区

译者:hurf在kubeconfig配置文件中设置一个环境项。摘要在kubeconfig配置文件中设置一个环境项。 如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。kubectl config set-context NAME [--clustercluster_nickname] [--useruser_nickname] [--namesp…

Linux文件系统基础(1)

本文首发于http://oliveryang.net,转载时请包含原文或者作者网站链接。 1. 什么是文件系统 直接引用来自维基百科文件系统的定义, A file system is a set of abstract data types that are implemented for the storage, hierarchical organization, ma…

使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题

理想的代码优化方式团队日常协作中,自然而然的会出现很多重复代码,根据这些代码的种类,之前可能会以以下方式处理方式描述应用时可能产生的问题硬编码多数新手,或逐渐腐坏的项目会这么干,会直接复制之前实现的代码带来…

React Native之Flexbox布局和监测文本输入onChangeText

1 Flexbox布局 1) flexDirection 可以决定布局的主轴,子元素是应该沿着水平轴(row)方向排列,还是沿着竖直轴(column)方向排列 2) justifyContent 决定其子元素沿着次轴(与主轴垂直的轴,比如若主轴方向为row,则次轴方向为…

半年总结——欲戴王冠,必承其重

【Introduction】 每一个女生都梦想着作为一个女王。但是你仅仅看到了女王头上金闪闪的王冠,却不知道在这个王冠下。她是怎样成长的!假设你想要做到有女王一样的权利,就必需要承担一个女王应该做到的事情!——欲带王冠&#xff0c…

SQL日期时间格式自由转换大全

日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT(varchar(10), 时间一, 23) 结果:2007-02-01 /*varchar(10)表示日期输出的格式,如果不够长会发生截取*/

一维数组和二维数组的区别_数组指针和指针数组的区别

数组指针和指针数组的区别 - hongcha_717 - 博客园​www.cnblogs.com数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的…

mysql 配置多个数据库连接_总结MySQL修改最大连接数的两个方式

问题在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认…

饿了么超级会员,年卡低至108元!饿了么会员,点外卖超省钱!

饿了么是大家常用的外卖平台,经常点外卖的朋友,充个饿了么超级吃货卡,还是能省不少钱的,今天给大家带来饿了么会员特价充值,会员秒到!饿了么超级会员特价充值月卡:原价15元,特价仅需…

React Native之内部方法常用几种写法和调用规则

1 简单部分代码 export default class App extends Component<Props> {render() {return (<View style{styles.container}><View style{styles.welcome}><Button onPress{this.showMsg}titleprees me showMsg/> <Button onPress{() > {this.sho…

阿里云欧洲数据中心开放运营:与沃达丰达成战略合作

摘要&#xff1a;近日&#xff0c;阿里云在德国宣布正式登陆欧洲市场&#xff0c;其位于欧洲的数据中心正式开放运营&#xff0c;同时与沃达丰达成战略合作&#xff0c;携手为欧洲提供云计算服务&#xff0c;并为中国企业进入欧洲市场提供互联网基础设施便利。 据悉&#xff0c…

C#ListView控件添加复选框并获取选中的数目

1、添加复选框:listView1.CheckBoxes = true; 2、选中listview并获取选中的数目: private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e){e.Item.Selected = e.Item.Checked;m = listView1.CheckedItems.Count;label1.Text = "当前选中数:"…

MFS学习总结

MFS学习总结 MFS概述、特性和新版改进MFS 工作原理和设计架构MFS的安装、部署、配置MFS的高级特性MFS的性能测试MFS集群的维护MFS的常见问题和建议对策一、MFS概述、特性和新版改进 MooseFS是一个分布式存储的框架&#xff0c;其具有如下特性&#xff1a; Free(GPL)通用文件系统…

python打开csv文件乱码_python脚本解决csv文件用excel打开乱码

import os path csv文件路径 targetPath 转换编码保存路径 def getfiles(path): path_collection[] for dirpath,dirnames,filenames in os.walk(path): for file in filenames: fullpathos.path.join(dirpath,file) path_collection.append(fullpath) return path_collection…