JS伪继承prototype实现方法示例
时间:2019-04-20
本文章向大家介绍JS伪继承prototype实现方法示例,主要包括JS伪继承prototype实现方法示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下:
众所周知JS中没有类的概念,但是要想实现类的功能可以同过function
模拟。如:
第一种继承 (属性继承)
//该函数相当于是一个构造器,也是一个伪类 function Fn(){ this.a = 4; this.b = 5; this.log = function(){ console.log(this.a,this.b); } } function Fn1(){ Fn.call(this);//调用父类的构造函数 } Fn1.prototype = Fn.prototype; var fn = new Fn(); var fn1 = new Fn1(); //由此可见Fn1 是fn1的子类。 fn1 instanceof Fn; // true fn instanceof Fn1; // true fn.a = 5; //由此可见Fn1 继承了 Fn得所有属性和方法 //而是是复制了一份Fn的属性和方法,并不是对象的引用。 console.log(fn.a); // 5 console.log(fn1.a); // 4 this.log(); // 4 5
总结: 这种继承,是重新拷贝一份放入内存中,他们的值互相独立,修改一个不会改变另一个。
第二种继承 原型继承(prototype)
function Fn(){} Fn.prototype.data = { name: 'zhangsan' } Fn.prototype.getName = function(){ return this.data.name; } function Fn1(){} //原型链继承 Fn1.prototype = Fn.prototype; var fn = new Fn(); var fn1 = new Fn1(); //所用Fn1 继承了 Fn fn1 instanceof Fn;//true console.log(fn1.getName()); // zhangsan console.log(fn.getName()); // zhangsan //修改了fn的name属性值 fn.data.name = 'lisi'; // 由此我们可看出 原型链继承 是 引用继承 //不会重新拷贝一份变量。就像对象的引用一样。 console.log(fn.getName()); // lisi console.log(fn1.getName()); // lisi
两种类的写法造成示例的区别
//第一种 function Fn(){ this.a = 4; this.b = 5; this.log = function(){ console.log(this.a,this.b); } } var fn1 = new Fn(); var fn2 = new Fn(); fn1.a = 1; //由此可以看出两个对象互不影响 //说明每个对象里都存在一份a和b fn1.log(); // 1 5 fn2.log(); // 4 5 //第二种 function Fn(){} fn.prototype.name = 'zhangsan'; fn.prototype.data = { a: 4, b: 5 } fn.prototype.log = function(){ console.log(this.data.a,this.data.b); } var fn1 = new Fn(); var fn2 = new Fn(); fn1.a = 1; //由此可见就算是不同的示例他们他们所指向的值是同一个。 fn1.log();//1 5 fn2.log();//1 5 fn2.name = 'lisi'; //这里fn1.name并没有被修改 console.log(fn1.name); //zhangan console.log(fn2.name); // lisi
总结
类中直接this.
出来的属性和方法都会直接复制一份给子类或者实例对象。个子类或实例对象之间互不影响。
使用prototype
增加的属性和方法,对象类型的只有一份,值类型的这会被复制。
收获
由于函数都是通用的,所以比较上面两种方法,第二种明显比第一种性能要好的多,因为避免了没有必要的复制,肯定会比较节省内存。所以以后写类的时候,尽量使用第二种方式。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
- Linux配置网卡
- 【爬虫军火库】生成指定日期间的日期列表
- 手把手教你安装大数据开发测试环境手把手教你安装大数据开发测试环境
- Humble Numbers(丑数) 超详解!
- 1284 2 3 5 7的倍数
- 爬虫入门到精通-爬虫之异步加载(实战花瓣网)
- 【爬虫军火库】Chrome F12使用Network分析异步请求
- 1305 Pairwise Sum and Divide
- mysql分布式数据库中间件对比mysql分布式数据库中间件对比
- 爬虫入门到精通-headers的详细讲解(模拟登录知乎)
- 1347 旋转字符串
- 爬虫入门到精通-网页的解析(xpath)
- HDU 2549 壮志难酬
- 爬虫入门到精通-网页的解析(正则)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文教你搞懂C语言的Q格式
- 基础算法之排序算法
- C++核心准则E4,5:设计并构建不变量
- Selenium实际应用注入并执行Javascript语句
- 什么是Python的 “内存管理机制”
- 2020年手工webpack构建react项目,完美支持ssr,包括css和图片资源
- php中赋值、浅拷贝与深拷贝
- 2020最新:100道有答案的前端面试题(下)
- UI自动化测试之ddt实战
- KVM 之网络配置
- Mysql操作
- CentOS7+nginx+uwsgi+Django部署之路
- 【翻译】200行代码讲透RUST FUTURES (4)
- 使用Flask部署图像分类模型
- Try2Cry:使用蠕虫技术传播的勒索软件