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

闭包

闭包充分利用了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. 初涉hash

    今天和朋友讨论一个问题 有两百亿个数,我给出一个数,找到这两百亿个数中两数相加等于它的组合.要求时间复杂度为线性,空间2G 解决思路是开一个hash表比如a[1000]将所有数存入hash表中,a[i ...

  2. SQL语句小总结

    无论是面试过程中,还是未来工作中,SQL都是一定会考到和用到的.所以,在此对之前看过的一些SQL知识点进行一下总结和记录,算是起到一个笔记本的作用.没有深入学习过SQL的和对SQL印象不太深的朋友可以 ...

  3. ZTOOLS HTTP&REGEXTEST&JSONS 工具包

    下载地址:点击下载

  4. Java中的构造代码块

    代码块 ----a静态代码块 ----b构造代码块 ----c普通代码块 执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. a.静态代码块: 静态代码块 ...

  5. SpringMVC——文件上传

    ----------------------------------------------------------------------------spring.xml-------------- ...

  6. JavaScript 的循环语句语法摘要

     if条件语句语法: if(condition){ statements; } 理解:圆括号里的是条件参数  ,花括号里的为执行的语句. 示例代码:if(1>2){ alert("Th ...

  7. day26 分布式监控系统开发

    本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设 ...

  8. python获取字典的key列表

    获取字典的所有key: # !/usr/bin/python3.4 # -*- coding: utf-8 -*- b = { 'video':0, 'music':23 } print(list(b ...

  9. Json格式应用

    Json格式在用于数据存储方面比xml有着空间上的优势,Json格式又主要分为两种格式:名称/值 对 和数组. 在我的业务环境中需要先把一种空间比较小的格式. 测试如下: 取数据库中的一张表然后生成两 ...

  10. JS跨域解决iframe高度自适应(IE8/Firefox/Chrome适用)

    参考园友的js跨越实现,有提到三种方式: 1. 中间页代理方式,利用iframe的location.hash 参见:http://www.5icool.org/a/201203/a1129.html ...