1 原型/原型链

1-1 原型

  • 定义:原型是function对象的一个属性,定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。

  • 原型是一个对象。

  • 可以利用原型的特性,提取共有属性。

  • 对象属性与在原型上属性的增删改查。

  • 对象如何查看原型 -> 隐式属性 __proto__

  • 对象如何查看构造函数 -> constructor

1-2 原型链

  • 原型链的构成(继承方法)。

  • 原型链与原型属性的增删改查基本相同。

  • this指向调用该方法的对象。

  • 大多数对象最终继承自Object.prototype

  • Object.create(proto)

  • 原型方法的重写。

1-3 代码分析

 Grand.prototype.lastName = "Chen";
function Grand(){}
var grand = new Grand();
Father.prototype = grand;
function Father(){
this.firstName = "Xianxian";
this.fortune = {
card1 : 'visa'
}
}
var father = new Father();
Son.prototype = father;
function Son(){
this.hobby = "play";
}
var son = new Son();

  执行效果如下:主要为了验证修改子类原始值不会影响父类,而修改引用值则会影响父类。

  

2 命名空间

【解决问题】

  为了解决多人合作开发过程中变量命名同名的问题,避免变量污染。

【实现方法】

  采用立即执行函数,以init()作为入口,调用init()即可执行其中的内容。最后该立即执行函数要有返回结果。因此需要为该组件编写好接口,并制定好相应的接口规范。

  返回函数相当于main入口,整体上形成闭包,立即执行函数内部的变量被私有化了。

【实现代码】

     <script>
// namespace
var name = 'global';
var initChen = (function(){
var name = 'local';
function output(){
console.log(name);
}
return function(){
output();
}
}())
initChen();
</script>

  代码执行结果为 'local'

【实现方法2】

  使用with(obj){...}:可以将内部的代码的作用域链的顶端修改为obj,即在with内部可以访问obj中的变量,进而实现作用域链。

  可以类比C++中的using namespace obj; obj::proc 来进行理解。

  缺点:修改了作用域链,影响执行效率。

  在es5中的严格模式"use strict"中被禁止使用。

  比如使用某一个人编写的代码块则可以with(obj.department1.Chen){}内部访问的即都是obj.department1.Chen以下的属性变量。

  或经常使用document.xxx则可以简化书写为with(document){ xxx }即可。

3 链式调用的实现原理

【问题引入】

  模仿jQuery中的链式调用的实现。

【核心思想】

  在对象中的每个方法都返回this,即可实现用调用方法的对象作为这个方法的返回结果放回到原来的位置上,这样一来,调用链就有恢复到了上一状态(即对象.调用方法()的状态)

【实现代码】

     <script>
// chain call
var chen = {
study : function(){
console.log('I love studying!');
return this; // return obj chen
},
exercise : function(){
console.log('I love exercising!!');
return this;
},
read : function(){
console.log('I love reading!!!');
return this;
}
}
chen.study().exercise().read();
</script>

4 对象枚举

【对象属性访问原理】

  obj.prop是常用的访问方式,但是在系统实现上是将其转化为了obj['prop']进行处理的。因此,我们可以知道,在对象属性访问的key索引中,都是做成了一个string的匹配索引问题。

【for_in循环】

  采用for(var prop in obj)的形式,可以遍历到obj中的每一个key值,并将该key值以string的类型存放值prop中。

  因此采用以下遍历访问形式是错误的:

    obj.prop

  执行这句会返回一个undefined,这是由于系统会自动转化为obj['prop']进行查找,若obj中没有prop为key的属性的话,那么自然就是一个undefined的结果。

  正确的遍历访问形式是这样的:

    obj[prop]

【hasOwnProperty】

  遍历过程中,我们通常只希望得到该对象的私有属性,而不取得原型上的属性,因此在封装对象枚举方法的时候,我们通常首先增加一层hasOwnProperty的判断。

【实现代码】  

     <script>
// enumerate
var obj = {
height : "100px",
width : "100px",
border : "1px solid #ccc",
position : "absolute"
}
for(var prop in obj){
if(obj.hasOwnProperty(prop)){
console.log(obj[prop]);
}
}
</script>

5 this  

  1.预编译时,会首先将this指向window

  2.全局变量的this指向window

  3.可以使用call()和apply()改变this的指向,传入的第一个参数为this指向的信息object

  4.this指向调用该方法的对象,如obj.fn(),那么fn中的this都指向obj

6 callee和caller

  1.arguments.callee:callee只能用于arguments参数列表,可以获取参数列表对应的被调用的函数。

    主要作用:立即执行函数执行后即被销毁从而无从寻找,因此可借助callee进行记录,进而实现递归调用。

    示例代码(递归计算一个10!):

     <script>
// callee
var init = (function(n){
if(n == 1) return 1;
return n * arguments.callee(n - 1);
}(10))
console.log(init);
</script>

  2.fn.caller:获取调用fn的函数

【学习笔记】JS知识点整理的更多相关文章

  1. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  2. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  3. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  4. JavaScript学习笔记及知识点整理_3

    1.js的事件冒泡及阻止方法:事件冒泡的概念:在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事 ...

  5. JavaScript学习笔记及知识点整理_2

    1.一般而言,在Javascript中,this指向函数执行时的当前对象.举例如下: var someone = { name: "Bob", showName: function ...

  6. JavaScript学习笔记及知识点整理_1

    一.js的基础部分 1.==和===的区别:==在判断是否相等的时候会进行类型转换,有时会得到非常奇怪的结果,因此一般情况下都是用===判断是否相等2.strict模式:在js中,如果一个变量没有用v ...

  7. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要三

    最近工作较忙,手上有几个项目等着我独立开发设计,所以平时工作日的时候没有太多时间,下班累了就不想动,也就周末有点时间,今天我花了一个下午的时间来继续总结与整理书中要点,在整理的过程中,发现了书中的一些 ...

  8. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  9. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引

    从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...

  10. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要二

    今天继续分享我的阅读<LEARNING HARD C#学习笔记>知识点总结与摘要二,仍然是基础知识,但可温故而知新. 七.面向对象 三大基本特性: 封装:把客观事物封装成类,并隐藏类的内部 ...

随机推荐

  1. Java开发笔记(八十五)通过字符流读写文件

    前面介绍了文件的信息获取.管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容.File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作. ...

  2. H5与C3权威指南笔记--transition动画

    translation:过渡 举个栗子:transition: width 1s linear; transition有三个属性,分别是transition-property, transition- ...

  3. Spring MVC(三)控制器获取页面请求参数以及将控制器数据传递给页面和实现重定向的方式

    首先做好环境配置 在mvc.xml里进行配置 1.开启组件扫描 2.开启基于mvc的标注 3.配置试图处理器 <?xml version="1.0" encoding=&qu ...

  4. 学习笔记—JVM

    JVM结构 JVM总体结构图 类加载子系统与方法区: 类加载子系统负责从文件系统和网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间. 除了类信息外,方法区中还可能会存放运行时常量池 ...

  5. Windows下配置Git多账号github码云

    Windows下配置Git多账号github码云 1.配置了全局用户名和邮箱 $ git config --global user.email "你的邮箱" $ git confi ...

  6. 用Gogs在Windows上搭建Git服务

    1.下载并安装Git,如有需求,请重启服务器让Path中的环境变量生效. 2.下载并安装Gogs,请注意,在Windows中部署时,请下载MiniWinService(mws)版本. 3.在Maria ...

  7. linux查看硬盘占用情况

    Linux命令 : df -hl 使用后文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on/dev/vda1 197G 5. ...

  8. Git 密钥对处理

    生成密钥对: ssh-keygen -t rsa cd .ssh ls      id_rsa          私钥      id_rsa.pub   公钥

  9. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

  10. 使用docker安装mysql和redis

    本文介绍在linux下使用docker安装mysql和redis. 原文地址:代码汇个人博客 http://www.codehui.net/info/59.html 测试环境:centos7.6,do ...