这章主要讨论闭包和原型,以及面向对象和继承。

闭包

闭包充分利用了JS里面作用域的概念,作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量。使用闭包主要是为了读取函数内部的变量或者将函数内部的变量始终保持在内存中,而不让JS垃圾回收机制回收,所以使用闭包会降低系统性能的,应该避免尽量少用。

具体看下面三个例子:

var elems = document.getElementsByTagName('a');
for(var i = 0; i<elems.length; i++){
elems[i].addEventListener('click', function(e){
e.preventDefault();
console.log('i am click' +i);
}, false);
}
for(var i =0; i< elems.length;i++){
elems[i].addEventListener('click', (function(i){
return function(e) {
e.preventDefault();
console.log('i am click' + i);
}
}(i)), false);
} for(var i = 0; i < elems.length; i++){
(function(i){
elems[i].addEventListener('click', function(e){
console.log("i am click" + i);
},false)
}(i));
}

第一个例子肯定有问题,输出的都是i am click11(总共有11个超链接),关键在于触发监听的时候,获取到的i是当前循环之后的变量i,所以值是11.

第二个例子和第三个例子都是实现闭包,第三个例子比较直观易懂。这里还涉及到一个立即执行的函数概念。

立即执行函数

有两种写法,推荐第一种,如下代码所示,立即执行匿名函数,帮助封装一些方法,并且不留下任何全局变量,保护命名空间的干净,另外在闭包中也经常使用。

(function () {
alert('hello world!');
}()); (function(){
alert('hello world!');
})();

还可以像匿名函数中传递参数,如下代码所示:当然如果你把一些插件的全局变量,例如JQuery,YUI,Global传进去,那就可以实现在他们插件的基础上扩展,而且不用担心变量污染的问题。

(function(name){
alert('hello world my name is '+name);
}('tonylp'));

具体可以参考文章JavaScript学习笔记(十四) 立即执行函数

原型

原型在很多场合都会用到,尤其是面向对象方向。

对于原型(prototype)记住它既是所有function类型的对象的一个属性,这个属性本身又是一个Object对象。(片面的说又是属性又是对象)。所以我们可以给这个prototype对象添加任意的属性和方法,既然prototype是对象的“原型”,那么有该函数构造出来的对象应该都会具有这个“原型”的特性。也可以这么说,prototype提供了一群类对象共享属性和方法的机制。从这里可以看出可以使用prototype在创建新对象的同时避免复制太多的东西占用内存。我可以只赋值新的变量,而使用公共的方法。还可以通过原型继承,实现原型链。

如下代码通过原型实现基础的类,可以看到SayHello这个公用方法。

function Person(name) {
this.name = name;
} Person.prototype.SayHello = function(){
alert("Hello i am" +this.name);
}
var BillGates = new Person("Bill Gates");
var SteveJobs = new Person("Steve Jobs");
BillGates.SayHello();
SteveJobs.SayHello();
aler(BillGates.SayHello() === SteveJobs.SayHello()); // true

接下来展示一段原型链代码,object->person->employee,在SteveJobs调用SayHello的时候,首先遍历employee对象,里面没有此方法,然后通过Person.call(this,name),进入Person对象,找到该方法,然后输出,注意传入参数this和name。 其实这也是基于原型的继承,不是么

function Person(name) {
this.name = name;
} Person.prototype.SayHello = function(){
alert("Hello i am" +this.name);
} function Employee(name, salary){
Person.call(this,name);
this.salary = salary;
}
Employee.prototype.showMeTheMoney = function(){
alert(this.name + "$" + this.salary);
};
var BillGates = new Person("Bill Gates");
var SteveJobs = new Employee("Steve Jobs", 2345);
BillGates.SayHello();
SteveJobs.SayHello();
SteveJobs.showMeTheMoney();
aler(BillGates.SayHello() === SteveJobs.SayHello()); // true

都到这里了,必然能想到如果我在JS内置的对象上使用prototype,就可以扩展内置对象的方法或者属性了,是的,这条路是可行的。

昨天说到一半的创建对象,接着继续,利用原型来创建对象。

基于原型创建对象

方法1,只使用原型,但是这个方法不好,因为把所有对象的属性也挂载到原型上了,太累赘,而且没法改。

var lev=function(){

    return "啊打";
};
function Parent(){ };
Parent.prototype.name="李小龙";
Parent.prototype.age="30";
Parent.prototype.lev=lev; var x =new Parent();
alert(x.name);

方法二,和函数结合,混合模型,这个比较好,属性和方法分离

function Parent(){
this.name="李小龙";
this.age=32; };
Parent.prototype.lev=function(){ return this.name;
};; var x =new Parent(); alert(x.lev());

方法三,动态加载,其实就是混合模型,多加了一些判断,防止重复创建原型方法。

function Parent(){
this.name="李小龙";
this.age=32;
;
if(typeof Parent._lev=="undefined"){ Parent.prototype.lev=function(){ return this.name;
}
Parent._lev=true;
} };

说到原型,肯定说到遍历,然后说到hasOwnProperty()方法,用来判断是否是函数本身的方法和属性,而不是原型链上的方法和属性,很有用。看段简单的代码就可以了。

Object.prototype.bar = 1;
var foo={moo : 1}
for (var i in foo) {
if(foo.hasOwnProperty(i)) {
alert(console.log(i))
}
}//此时只会输出moo属性

JS中主要大的概念都已经说完了,还剩下一个this指针,通过this还是讲讲继承,还有AMD和CMD的一些简单介绍,JS里面的一些深坑,还有如果想继续往上深入的一些方向,在下一篇文章中结束吧。之后打算看看一些插件的源码,主要的知识点概念就那些,其实这门语言也不难的,被各大浏览器厂商坑了,还有开发这门语言的人,留下了太多的深坑,总的来说还是很有意思的,完全不同于C++,JAVA那套严谨的面向对象知识。

话说你们用webstorm卡不卡,为什么我用着这么卡呢。

以上全部都属个人思想总结,请大家转载的时候附上原创链接: http://www.cnblogs.com/tonylp

前端学习实践笔记--JavaScript深入【3】的更多相关文章

  1. 前端学习实践笔记--JavaScript深入【1】

    这一年中零零散散看过几本javascript的书,回过头看之前写过的javascript学习笔记,未免有点汗颜,突出“肤浅”二字,然越深入越觉得javascript的博大精深,有种只缘身在此山中的感觉 ...

  2. 前端学习实践笔记--JavaScript深入【2】

    趁热继续再来学习一波,接下来主要介绍函数,object,数组,面向对象,new实例化. 在介绍“对象”之前,首先得梳妆打扮一番吧,那这梳妆打扮主要有两条路线,一条是淑女范(利用函数对象化),一条是邻家 ...

  3. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  4. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  5. Day17-18前端学习之路——Javascript事件

    用户在某个元素上点击鼠标或悬停光标. 用户在键盘中按下某个按键. 用户调整浏览器的大小或者关闭浏览器窗口. 一个网页停止加载. 提交表单. 播放.暂停.关闭视频. 发生错误. 更多事件:https:/ ...

  6. 【InfluxDB】InfluxDB学习实践笔记

    InfluxDB是用Go编写的一个开源分布式时序.事件和指标数据库,无需外部依赖.它与Elasticsearch.Graphite等类似.比较适用于与事件紧密相关的数据,例如实时日志数据.实时监控数据 ...

  7. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记

    <疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...

  8. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  9. 【前端】Web前端学习笔记【2】

    [2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...

随机推荐

  1. documentfragment

    JS临时容器,父类是null,存储实际是把存储对象所有子类存储在里面,localStorage,浏览器支持情况下,保存本地变量

  2. HDU-3247 Resource Archiver(AC自动机+BFS)

    Description Great! Your new software is almost finished! The only thing left to do is archiving all ...

  3. unity行为树制作AI简单例子(1)

    用行为树来制作AI是非常方便的,今天就给大家简单介绍一下行为树的强大之处. 所用插件 Behavior Designer v1.421 最开始 我使用过Rain插件,不过用过Behavior Desi ...

  4. 命名空间System.Threading命名空间的同步锁 Monitor类

    官方备注: Monitor类通过向单个线程授予对象所来控制对对象的访问.对象所提供限制访问代码块的能力.当一个线程拥有对象的锁时,其他任何线程都不能获取该锁.还可以使用Monitor来确保不会允许其他 ...

  5. python获取文件大小

    python获取文件大小 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import os # 字节bytes转化kb\m\g def formatSiz ...

  6. UNION 和 UNION ALL 区别

    UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1.UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 ...

  7. js点击后将文字复制到剪贴板,将图片复制到剪贴板

    复制文字: <table width="99%" border="0" cellpadding="0" cellspacing=&qu ...

  8. 用Ant来做一键部署

    部署Java Web项目到远程服务器上,以前经常用的操作方式: 1.在eclipse上导出项目war包 2.把war包通过ftp方式传到服务器上,比如Tomcat的webapps目录下 3.启动tom ...

  9. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  10. Mongo集合操作Aggregate

    最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...