面向对象程序设计(Object-oriented programming,OOP)
特征:封装/继承/多态/抽象
JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
js只有2种作用域
局部
全局
ES6: let 块级作用域
- 如果在块中,没有var声明,都会自动提升为全局变量
- 局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部
作用域链(Scope Chain)
总结:
每一个Execution Context(运行期上下文)中都有一个VO(variable object),用来存放变量,函数和参数等信息。
在JavaScript代码运行中,所有用到的变量都需要去当前(activition object)AO/VO中查找,当找不到的时候,就会继续查找上层Execution Context中的AO/VO。这样一级级向上查找的过程,就是所有Execution Context中的AO/VO组成了一个作用域链。
所以说,作用域链与一个执行上下文相关,是内部上下文所有变量对象(包括父变量对象)的列表,用于变量查询(作用)。Scope = VO/AO + All Parent VO/AOs
作者: GD_SeHun
链接:http://www.imooc.com/article/3009
来源:慕课网
demo:
var x = 10; function foo() {
var y = 20; function bar() {
var z = 30;
console.log(x + y + z);
};
bar()
};
foo();
//函数bar可以直接访问"z",然后通过作用域链访问上层的"x"和"y"。
如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。
结合作用域链看闭包
prototype:是函数对象上预设的对象属性
_proto_:对象上的原型
function Person(name,age){
this.name = name; //this 指向 person.prototype
this.age = age;
}
创建函数实例时,对象的原型会指向对象的prototype值。
Person.prototype.hi = function(){
console.log(this.name+” “+this.age);
}
Person.prototype.walk = function(){
console.log(this.name+” is walking… “);
}
function Student(name,age,className){
Person.call(this,name,age);
this.className = className;
}
补充:
call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。apply方法:
语法:apply([thisObj[,argArray]])
定义:
应用某一对象的一个方法,用另一个对象替换当前对象。
说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
Student方法继承person.prototype:
Student.prototype = Object.create(Person.prototype);
//Object.create:创建一个空对象(这里的空对象是Student.prototype),对象原型指向Person.prototype数,既可以查找到person的方法,又可以在创建Student.prototype方法的同时不影响Person.prototype
Student.prototype.constructor = Student;
//不设置会指向Person
Student.prototype.hi覆盖hi方法,原型链向上查找
Student.prototype.hi = function(){
console.log(this.name+” “+this.age);
}
一旦基础数据类型调用了 方法 或者 属性 都会包装成为 对象
持续补充..
作用域参考网站:
http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html