新手如何理解JS面向对象开发?
今天有时间讲讲我对面向对象的理解跟看法,尽量用通俗的语言来表达,多多指教!
如今前端开发已经越来越火了,对于前端开发的要求也是越来越高了,在面试中,经常有面试官会问:你对JS面向对象熟悉吗?
其实,也就是相当于在问你,在工作中有没有用过面向对象开发?说到这里,有人就问了,什么事面向对象?
面向对象: 用我个人最简单的理解表达就是,Object的操作。另外一种理解: 给你一个条件,你去找个对象帮我处理这个事情,你就不要自己动手了。
说白了,我们就是在操作对象,那么我们就需要去创建这个对象,创建对象的方法有很多种,这里就不一一列举了,但是我们要知道,操作的所有的对象都是Object的实例,甚至还可以从原型去生成实例对象。
工作例子:
var obj = {};
obj.token = '';
obj.username = '';
obj.userid = '';
这样,一个对象搞定了。如果我们要写很多个呢?比如很多地方都用到了,是不是重复要写很多次?MMP,头都大了。
有没有办法解决呢?
那么有人就问了,为什么不做一个简单的封装呢?比如:
function obj (token,username,userid) {
return {
token:token,
username:username,
userid:userid
}
}
然后需要的时候,调用这个obj方法传参就OK了呀?
那么问题来了,封装是没错,也能用,也有道理,那么请问,你这不是在调用函数吗?用一次调一次,他们之间有关系吗?
这时候就问了,那怎么办?有,其实也就说,有没有办法让不同的实例都指向同一个方法(函数)让他们产生关系。那么JS就给出了构造函数这个模式用来解决从原型对象去生成实例,使用了this变量,new运算符。
先不上例子,先说说为什么构造函数能解决这个问题。首先,它也是一个普通的函数,就是因为它用了this变量与new运算符使得它能够从原型对象上去new一个实例,并且JS规定每一实例都要有一个constructor属性,这个属性可厉害了,它的作用就是把每一个实例都指向同一个构造函数。也就是说,不管你生多少个儿子,爸爸就是那个构造函数。
接着看个例子:
function obj () {
this.token:token;
this.username:username;
this.userid:userid;
}
var obj1 = new obj('asdfsdf82377888sdfds','john',1);
var obj2 = new obj('dfvswc89923884928k','Steph',2);
好了,例子也有了,根据上面的解释,你可以理解为obj1,obj2的爸爸都是obj,也就是都是构造函数obj的实例。
来个工作中涉及到的案例,比如上面的例子是发送一条数据到后台的,并且在前端需求中明确要求这个信息是要有时间的,也就是说这条信息是什么时候发布的也要现实出来,这时候后端程序员说:“我不处理了,你自己一起送过来吧”。那这时候,怎么处理?来来来,往下看
function obj () {
this.token:token;
this.username:username;
this.userid:userid;
this.tamp: new Date().getTime();
}
这样,O了!
问题来了,在每次生成实例的时候,this.tamp这个属性是不是都要自动生成一次?而每个实例都多出这么一个属性所占有的空间,是不是浪费资源?
解决办法: 属性prototype
先来说说概念,构造函数prototype属性,这个属性指向一个对象,而这个对象的所有的属性跟方法,都会被构造函数的实例所继承。
什么意思呢?也就是说,构造函数的这个属性里的东西都可以被它的实例继承
举例:obj构造函数定义一个prototype属性,这个属性指到一个对象,我们给这个对象加上一个属性,比如就叫tamp,那么这个属性都会被obj的实例拿到。也就解决了上面的问题。
最终可以这么写:
function obj () {
this.token:token;
this.username:username;
this.userid:userid;
}
obj.prototype.tamp = new Date().getTime();
var message = new obj('sdfasdf434fasf','name',3);
var final = JSON.parse(JSON.stringify(message));
final.tamp = message.tamp;
最后将final对象传给后台搞定!
新手如何理解JS面向对象开发?的更多相关文章
- 全面理解js面向对象
前言 当今 JavaScript 大行其道,各种应用对其依赖日深.web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学 ...
- js面向对象开发基础
js的面向对象开发能力较弱,基本是以prototype为核心的面向对象,虽然现在出了个class这玩意,但本文还是先不做探讨. 面向对象基础——构造函数方法 var Fly = function (s ...
- 悟透JavaScript(理解JS面向对象的好文章)
引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...
- 原生js日历选择器,学习js面向对象开发日历插件
在web开发过程中经常会碰到需要选择日期的功能,一般的操作都是在文本框点击,然后弹出日历选择框,直接选择日期就可以在文本框显示选择的日期.开发好之后给用户使用是很方便,但如果每一个日历选择器都要临时开 ...
- JS面向对象使用面向对象进行开发
面向对象基础一之初体验使用面向对象进行开发 对 JS 中的面向对象的基础进行讲述, 初体验使用面向对象进行开发 主要内容是 面向对象的概念及特性 用面向对象的方式解决简单的标签创建实例 一些基础的 ...
- js面向对象理解
js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- js原型和原型链理解到面向对象
一.js中的两种对象,普通对象和函数对象 var obj1 = {}; var obj2 =new Object(); var obj3 = new obj1(); function fun1(){} ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
随机推荐
- C Programming Style 总结
对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...
- 数据库和SQL面试题基础知识(持续更新)
数据库方面基础知识复习 常问小问题: 一.like查询大小写问题: sql查询结果去重 SELECT distinct name FROM 表:平均数avg 一.like查询大小写问题: ①用bina ...
- [转帖]Ansible批量远程管理Windows主机(部署与配置)
2018-09-12 12:04:42 https://blog.51cto.com/7424593/2174156 一.测试环境介绍 Ansible管理主机: 系统: CentOS6.8 IP ...
- 神经网路-SGD-1
SGD神经网络以及python中实现 1.SGD(stochastic gradient descend):<1>数据抽取:<2>计算梯度;<3>参数更新:< ...
- Visual Studio 2019 (VS2019)正式版安装 Ankh SVN和VisualSVN插件
VS2019 正式版最近刚刚推出来,目前 Ankhsvn 还不支持,它最高只支持 VS2017,全网搜索了一下,也没有找到.在 Stackoverflow 上看了一下,找到这篇问答: 自己按照这种方法 ...
- docker之常用命令、自定制镜像、公(私)仓库的上传和下载
一.docker命令 1.参数和命令汇总 1. 参数 Options: --config=~/.docker Location of client config files #客户端配置文件的位置 - ...
- ORACLE表数据误删除的恢复方法(提交事务也可以)
ORACLE表数据误删除的恢复方法(提交事务也可以) 缓存加时间戳 开启行移动功能:ALTER TABLE tablename ENABLE row movement 把表还原到指定时间点:flash ...
- JPA的merge对联合唯一索引无效(代码库)
问题 JPA的merge()操作 是合并的意思,就是当保存的实体时,根据主键id划分,如果已存在,那么就是更新操作,如果不存在,就是新增操作 但是这个仅针对 主键id 划分,对联合唯一索引 无效,两次 ...
- [九省联考2018]秘密袭击coat
[九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...
- Django 2.0.4 微博第三方登录
三方登录逻辑 理解第三方登录的流程: 用户向本地应用商城发起请求,我要用微博进行登录 我们的商城凑一个url让用户跳转到第三方应用的url(微博的登录页面) 用户在该界面点击输入用户名密码之后,点击授 ...