JavaScript 高级特性
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 高级特性的更多相关文章
- javascript高级特性
01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...
- javascript高级特性(面向对象)
javascript高级特性(面向对象): * 面向对象: * 面向对象和面向过程的区别: * 面向对象:人就是对象,年龄\性别就是属性,出生\上学\结婚就是方法. * 面向过程:人出生.上学.工作. ...
- JavaScript高级特性-数组
1. JavaScript中的数组 在C++.Java中,数组是一种高效的数据结构,随机访问性能特别好,但是局限性也特别明显,就是数组中存放的数据必须是同一类型的,而在JavaScript中,数组中的 ...
- JavaScript高级特性-创建对象的九种方式
1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...
- JavaScript高级特性-实现继承的七种方式
声明和约定: 在C++和Java中,我们可以通过关键字class来声明一个类,在JavaScript中没有这个关键字,但我们知道可以通过new一个function创建对象,这个function类似C+ ...
- JavaScript高级特性之原型
JavaScript的原型 原型prototype属性仅仅适用于函数对象(这里的函数对象是自己为了理解更好定义的,普通对象是没有原型属性的) 1.研究函数原型: <script type=&qu ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- 【javascript学习——《javascript高级程序设计》笔记】DOM操作
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...
随机推荐
- 第一次 刷 WiFi 模块esp8266 感谢创客阿正
在正哥指导下 第一次 刷 WiFi 模块 少走了 不少弯路 套件里的 两块 机智云 ==== 我的电脑 需要单独供电 先 对应 接好 ic0要记得接gnd 等待上电时要断电重启 等 用助手 返回 ...
- mongo常用sql
基本查询 db.getCollection('chdr').find({chdrnum:"test123456"}) lookup关联查询 db.getCollection ( ...
- 多态 与 鸭子类型 duck duck duck
# --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对 ...
- iOS .tbd
http://stackoverflow.com/questions/31450690/why-xcode-7-shows-tbd-instead-of-dylib http://www.jiansh ...
- mac安装brew简单方法
安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- Selenium之table操作
操作内容: 获取table总行数.总列数.获取某单元格的text值,删除一行[如果每行后边提供删除的按钮] HTML代码: <html><head><meta http- ...
- select 下拉选择自动到textarea框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python接口测试-将运行结果写入Excel表格
公司工作是促进学习的第一生产力!! 一个get请求的接口,我想清楚的在Excel中看到所有的数据! 带着学过H5,php觉得所有代码都很简单的自信,在公司开发的[鼓励]下开始了一上午的斗争 一个小时. ...
- Container 组件
Container 组件 padding: const EdgeInsets.fromLTRB(10, 0, 30, 0),//内边距 margin: const EdgeInsets ...
- Codeforces 1105C: Ayoub and Lost Array(递推)
time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: sta ...