1. 原型Prototype

1.1 构造函数

  所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。  

function Cat(name, color) {
this.name = name;
this.color = color;
} var cat1 = new Cat("大毛", "黄色");
var cat2 = new Cat("二毛", "黑色");
alert(cat1.name); // 大毛
alert(cat1.color); // 黄色 //这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。
cat1.constructor == Cat; //true
cat2.constructor == Cat; //true function Cat(name, color) {
this.name = name;
this.color = color;
this.type = "猫科动物";
this.eat = function () { alert("吃老鼠"); };
} cat1.type; // 猫科动物
cat1.eat(); // 吃老鼠
//每一个实例对象,每一次生成重复内容内存,但是内存地址不一样
cat1.eat == cat2.eat; //false

1.2 实例.constructor

  每个构造函数生成实例的时候 会自带一个constructor属性 指向该构造函数。对于普通对象生成实例时,constructor指向其类型的构造函数。

  结论1: 实例.constructor == 构造函数

function Cat(name) {
this.name = name;
}
var cat1 = new Cat("大毛");
cat1.constructor == Cat; //true var str1 = "123";
str1.constructor == String;//true

1.3 实例.prototype

  构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

  对该构造函数的实例,继承的prototype对象都指向同一个。

  结论2: 实例1.prototype.func == 实例2.prototype.func

function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function () { alert("吃老鼠") }; cat1.eat == cat2.eat;//true
// hasOwnProperty判断是自己本身的属性还是继承的
cat1.hasOwnProperty("name"); //true
cat1.hasOwnProperty("type"); //false

1.4 实例.__proto__

  Javascript创建对象时(普通对象和函数对象),都会内置一个__proto__属性,指向 实例的创建函数(实例.constructor).prototype

  结论3: 实例.__proto__ === 构造函数.prototype

  同理: 构造函数.prototype.__proto__ === Object.prototype

2. 作用域Scope

2.1 全局变量

  全局声明的变量,浏览器环境实际上声明在顶层变量"window"下。

  函数内部声明变量时,未使用var关键字,会声明为全局变量。  

function f1() {
n = 999;
}
f1();//调用函数时,n被注册到全局
alert(n); // 999
alert(window.n); // 999

  

2.2 局部变量

  只能在局部使用并可见的变量,如函数内部声明的变量  

function f2() {
var n = 999;
alert(n);//
}
alert(n);//报错

2.3 链式作用域

  父对象的所有变量,对子对象都是可见的,反之则不成立

//子对象会一级一级地向上寻找所有父对象的变量
function f1() {
var n = 999;
function f2() {
//n对f2可见
alert(n); //
}
}

3. 闭包Closure

  什么是闭包; 定义在一个函数内部的函数 (闭包就是能够读取其他函数内部变量的函数)

//下面的f2就是一个闭包
function f1() {
var n = 999;
function f2() {
alert(n);
}
return f2;
}
var result = f1();
result(); // 999
//注意result后跟的(),这对括号才是实际调用

用途:

  • 读取函数内部的变量
  • 让函数内部变量的值始终保持在内存中

闭包执行时的this指针指向问题

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
};
}
}; alert(object.getNameFunc()());//The Window
//上面这句解开后等于 
alert(function () { return this.name; }()); //此时this指针指向当前域下的name="The Window"
var name = "The Window";
var object = {
name: "My Object",
  getNameFunc: function () {
 var that = this;
   return function () {
    return that.name;
    };
  }
}; alert(object.getNameFunc()());//My Object
//分解如下
alert(function () { return that.name; }());//that是对object内部this变量的引用, object内部this指向实例本身
alert(function () { return object.name; }());//最终如此

refers:

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

JavaScript 高级特性的更多相关文章

  1. javascript高级特性

    01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...

  2. javascript高级特性(面向对象)

    javascript高级特性(面向对象): * 面向对象: * 面向对象和面向过程的区别: * 面向对象:人就是对象,年龄\性别就是属性,出生\上学\结婚就是方法. * 面向过程:人出生.上学.工作. ...

  3. JavaScript高级特性-数组

    1. JavaScript中的数组 在C++.Java中,数组是一种高效的数据结构,随机访问性能特别好,但是局限性也特别明显,就是数组中存放的数据必须是同一类型的,而在JavaScript中,数组中的 ...

  4. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

  5. JavaScript高级特性-实现继承的七种方式

    声明和约定: 在C++和Java中,我们可以通过关键字class来声明一个类,在JavaScript中没有这个关键字,但我们知道可以通过new一个function创建对象,这个function类似C+ ...

  6. JavaScript高级特性之原型

    JavaScript的原型 原型prototype属性仅仅适用于函数对象(这里的函数对象是自己为了理解更好定义的,普通对象是没有原型属性的) 1.研究函数原型: <script type=&qu ...

  7. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  8. 【javascript学习——《javascript高级程序设计》笔记】DOM操作

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...

  9. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

随机推荐

  1. CentOS系统Nginx安装配置,随时更新

    ./configure --prefix=/etc/nginx \ #指定安装目录 --sbin-path=/usr/sbin/nginx \ #指定执行路径--conf-path=/etc/ngin ...

  2. 2017年4月28日16:40:40 log

    //TODO order  CreateOrderServiceHandler  generateManagementCustomer 子活动名称和uid

  3. 29.求3x3的整数矩阵对角线元素之和

    #include <stdio.h> #include <stdlib.h> int main() { ,a[][]; ;i<;i++) { ;j<;j++) sc ...

  4. 2018-计算机系机试(第二批)-D-最小差值

    单点时限: 2.0 sec 内存限制: 256 MB 输入 n 个整数,输出最小差值.最小差值指所有数之间差的绝对值的最小数. 例如:3 个整数 1,2 和 6 的最小差值是 1. 输入格式 第一个数 ...

  5. 抛开visual studio,纯手工创建asp.net mvc遇到的问题

    脱离Visual Studio,只用文本编辑器..NET Framework.IIS Express创建ASP.NET MVC应用时,需要精简~/View目录下web.config文件内容,之前创建的 ...

  6. iOS跳转第三方应用举例一号店和京东

    1.首先要跳转到第三方应用都需要知道第三方应用的scheme,虽然百度能得到很多,但是不乏一些新增的或者改了的,怎么获得APP的scheme,鉴于现在iTunes不好用了,介绍一个app ---app ...

  7. 基于vue的图片查看插件vue-photo-preview

    1. 安装 在任务管理器中输入命令 2. 在项目main.js中引入 3.在所需要的项目中直接使用 还有两个属性,可以看需求添加 preview-title-enable="false&qu ...

  8. mysql navcate longblob 查询结果导出倒入

    由于之前项目为了查询方便,且不受权限控制.所以把image储存在了数据库.但是也遇到了很多瓶颈问题. 1,丢图从日志上查询获知,丢图95%以上是由于mysql的timeout时间失效引起的.(由于另一 ...

  9. DatePickerAndroid用法

    一.代码/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import ...

  10. Spring4.x Jpa + hibernate的配置(废弃JpaTemplate)

    近年来 ORM(Object-Relational Mapping,对象关系映射,即实体对象和数据库表的映射)技术市场热闹非凡,各种各样的持久化框架应运而生,其中影响最大的是 Hibernate 和 ...