~ 解析器在调用函数时,每次都会向函数内部传递进一个隐含的参数 this 。 它指向的是一个对象,这个对象我们成为函数执行的上下文对象。根据函数的调用方式不同,这个 this 指向不同的对象。

function fun () {console.log (this);}
fun ();

结果:[object window] 。

function fun () {console.log (this);}
var obj = {name: "孙悟空",sayName: fun};
fun ();

结果:[object object] 。

~ 以函数的形式调用时,this 永远是 window 。以方法的形式调用时,this 为对象。

function fun () {console.log (this.name);}var obj = {name: "孙悟空",sayName: fun};var obj2 = {name: "沙和尚",sayName: fun};obj.sayName ();

结果:孙悟空。

~ 使用工厂方法来创建对象:所创建的对象类型都是 object 类型,导致我们无法区分出多种不同类型的对象。

~ 构造函数:使用一个构造函数来创建 person 对象。构造函数是一个普通的函数,不同的是构造函数习惯上首字母大写。并且二者的调用方式不同。普通函数是直接调用,而构造函数需要使用 new 关键字来调用。

//创建一个 Person 构造函数:
//(在 Perosn 构造函数中,为每一个对象都添加了一个 sayName 方法。)
//(构造函数每执行一次,都创建一个新的 sayName 方法,即所有实例的 sayName 都是唯一的。)
function Person (name, age, gender) {this.name = name;this.age = age;this.gender = gender;//向对象中添加一个方法:this.sayName = function () {alert ("hello 大家好,我是"+this.name);};
}
//创建一个 Person 的实例:
var per = new Person ("孙悟空", 18, "男");
console.log (per);

~ 构造函数的执行流程:1. 构建函数时,立刻创建一个新的对象。2. 将新建的对象设置为函数中的 this ,在构造函数中可以使用 this 来引用新建的对象。3. 逐行执行函数中的代码。4. 将新建的对象作为返回值返回。

~ 使用同一个构造函数创建的对象,我们成为一类对象,也将一个构造函数称为一个类。通过一个构造函数创建的对象,称为是该类的实例。

~ 使用 instanceof 可以检查一个对象是否是一个类的实例。 语法:console.log (per instanceof Person); 如果是则返回 true 否则返回 false 。所有的对象都是 Object 的后代。任何对象和它做检查时都返回 true 。

~ this :1. 当以函数的形式调用时,this 是 window 。2. 当以方法的形式调用时,谁调用方法谁就是 this 。3.  当以构造函数的形式调用时, this 就是新创建的那个对象。

function Person (name, age, gender) {this.name = name;this.age = age;this.gender = gender;//向对象中添加一个方法:this.sayName = fun;
}
//将 sayName 方法在全局作用域中定义
function fun () {alert ("hello 大家好,我是"+this.name);};
//创建一个 Person 的实例:
var per = new Person ("孙悟空", 18, "男");
console.log (per);

这样,就不需重复创建多个 sayName 方法。但将函数定义在全局作用域中,污染了全局作用域的命名空间。而且定义在全局作用域中也很不安全。

~ 原型 prototype :我们所创建的每一个函数,解析器都会向函数中添加一个 prototype 属性。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。如果函数作为普通函数调用, prototype 没有任何作用。当函数以构造函数调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象。我们可以通过__proto__来访问该属性

function MyClass () {}
var mc = new MyClass ();console.log (mc.__proto__ == MyClass.prototype);
//返回值为 true ,说明二者指向同一个 prototype 对象。

~ 原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象。我们可以将对象中共有的内容,统一设置到原型对象中。当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。

function Person (name, age, gender) {this.name = name;this.age = age;this.gender = gender;
}
//向原型中添加 sayName 方法
Person.prototype.sayName = function () {alert ("hello 大家好,我是"+this.name);
};//创建一个 Person 的实例:
var per = new Person ("孙悟空", 18, "男");
var per2 = new Person ("猪八戒", 28, "男");
per.sayName ();
per2.sayName ();

以后我们创建构造函数时,可以将这些对象共有的属性和方法统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这种属性和方法。

~ 使用 in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有会返回 true 。可以使用对象的 hasOwnProperty () 来检查对象自身中是否有这个属性,如果没有则去原型的原型中寻找,直到找到 Object 对象的原型。若依然没有找到,则返回 null 。 语法:console.log (mc.hasOwnProperty("属性")); 。hasOwnProperty 在原型对象的原型对象中(原型对象也是原象,也有原型。Object 对象的原型没有原型。)。

~ 当我们直接在页面中打印一个对象时,实际上是输出对象的 toString () 方法的返回值。如果我们希望在输出对象时不输出 [Object Object] ,可以为对象添加一个 toString () 方法。

~ 垃圾回收(GC):程序运行过程中会产生垃圾,垃圾积攒过多会导致运行速度过慢。我们需要一个垃圾回收机制来处理程序运行过程中产生的垃圾。当一个对象没有任何的变量或属性对它进行引用(obj = null;),此时我们永远无法操作这个对象,成为垃圾。在 JS 中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁。我们不需要也不能进行垃圾回收的操作。只需将不再使用的对象设置为 null 即可。

JavaScript 学习笔记 p61 - 69相关推荐

  1. JavaScript学习笔记(一)-Learning Advanced JavaScript

    JavaScript学习笔记 (一)- Learning Advanced JavaScript Learning Advanced JavaScript #2: Goal: To be able t ...

  2. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  4. JavaScript学习笔记(五)

    JavaScript学习笔记(五) ①Array类 本地对象 ②Date类 ①Global对象 对象的类型   内置对象 ②Math对象 宿主对象 今天继续学习JS中的对象,昨天内置对象Global对 ...

  5. JavaScript学习笔记(备忘录)

    JavaScript学习笔记(备忘录) ===运算符 判断数值和类型是否相等.如: console.log('s'==='s') //输出trueconsole.log('1'===1) //输出fa ...

  6. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. JavaScript学习笔记(十)——学习心得与经验小结

    JavaScript学习笔记(十)--学习心得与经验小结 目前我先列好提纲,利用每晚和周末的闲暇时间,将逐步写完 ^_^ 转载于:https://www.cnblogs.com/mixer/archi ...

  8. JavaScript 学习笔记(1)

    1.     何为 Jscript JScript 是一种解释型的.基于对象的脚本语言. 局限性: 1)        不能使用该语言来编写独立运行的应用程序 2)        没有对读写文件的内置 ...

  9. 前端获取div里面的标签_web前端教程JavaScript学习笔记DOM

    web前端教程JavaScript学习笔记 DOM一DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 ...

  10. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

最新文章

  1. 无人驾驶急需解决:规划控制和传感器价格高两大问题(附Apollo算法)
  2. 大学生就业重心能否“二线城市化”?
  3. php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
  4. sublime text 使用笔记
  5. Michael Jordan:当下的AI其实都是伪“AI” 1
  6. java数组数据结构_Java数据结构之数组
  7. druid 异常 com.alibaba.druid.pool.GetConnectionTimeoutException
  8. 我们不知道我们不知道:用同化项目做网络安全
  9. 突破网吧限制的安全技术(转)
  10. python批量打印word_Python操作Word批量生成文章的方法
  11. signature=af972d07a7b1e8cd17a3d011d31aa690,a00836.html
  12. rac 配置oracle互信,Oracle19C RAC 用户互信问题处理
  13. 阿里云技术专家刘晨旭:阿里云对数据可靠性保障的一些思考
  14. android 一键接入新浪微博,腾讯微博,人人网,QQ空间,微信好友圈 (只需5分钟)
  15. Android性能优化系列之布局优化,Android程序员校招蚂蚁金服
  16. allegro中design size无法修改
  17. 使用do…while循环语句计算正数5的阶乘
  18. 原创图片可以进行版权登记吗?
  19. YL-236 LCD12864汉字显示C语言编程
  20. (esp32+MQTT+云服务器+MySQL)实现物联网温湿度数据采集到云端数据库MySQL

热门文章

  1. 猴子吃桃问题的函数递归解决方案
  2. 小葵花妈妈课堂之Nginx Rewirte
  3. matlab 求三维质心,如何计算三维质心?
  4. 在线制图:腾讯云架构在线绘制
  5. matlab给定振形用图表示,基于 MATLAB 的简谐振动合成图形的动态演示
  6. 如何释放计算机内存吗,Win7如何释放内存?三招帮你将电脑中的垃圾全部清理掉!...
  7. phalapi做登录检测_欢迎使用PhalApi!
  8. 连接防火墙/路由器的几种方式
  9. 仿百度导航跟随效果demo效果示例(整理)
  10. Taylor Swift - Mean-pdf