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. js转换时间戳-转换成 yyyy-MM-dd HH:mm:ss

    比如:转换成 yyyy-MM-dd HH:mm:ss //时间戳转换方法 date:时间戳数字 function formatDate(date) { var date = new Date(date ...

  2. 学习笔记—XML

    XML XML简介 XML指可扩展标记语言(EXtensible Markup Language),是一种标记语言. XML是一种灵活的语言,标签没有被预定义,需要自行定义标签. 通常,XML被用于信 ...

  3. 硬杠后端(后端坑系列)——Django前期工作

    Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式. MVC MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件 ...

  4. flex 输入框布局

    1:创建一个弹性容器(display:flex) 2:构建2个或3个弹性项目. 3:把弹性项目设置为居中对齐.(align-items:center) 4:改变input自身对齐方式,把它设置为拉伸以 ...

  5. Salesforce的对象关系

    对象关系 Salesforce中的对象关系和一般的关系数据库不同. 在关系数据库中对象间的关系是由主键.外键等加以定义.而在Salesforce中,对象之间的关系是由自定义字段来确定. 这么做的原因是 ...

  6. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(2)!

    前言- 明确了项目目录的结构,但是结构什么的也太"抽象"了. 本篇开始上代码! 模型的绘制- 前几天的学习中,live2d的绘制有了一些了解了,在Android端使用OpenGL ...

  7. 数据结构java(一)数组链表

    链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储. 相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存. 所以只需要创建一个对象 ...

  8. citrix外企,鸡鸣寺,玄武湖环跑,七牛云笔试

    笔记汇总,计算机网络笔记汇总 昨天下江宁,经历了人生第一场f2f面试,外企,citrix思杰:(准备好久都英文介绍没用上sad) 全程一个半小时,最后被面试官夸是面过人中,对计算机网络理解最多的(希望 ...

  9. IDEA XML注释与取消注释快捷键

    IntelliJ IDEA和eclipse中编辑Java文件时,注释和取消注释的快捷键都是: "CTRL + / " 编辑xml文件时, 注释:CTRL + SHIFT + / 取 ...

  10. nginx性能优化(针对于高并发量仅供参考,并不是方案)

    目录 关于nginx.conf中的优化 配置nginx客户端网页缓存本地时间 nginx日志切割 nginx连接超时优化 Nginx 实现网页压缩功能 Nginx 实现防盗链功能 为目录添加访问控制 ...