面向对象程序设计(Object-oriented programming,OOP)

来源:互联网 发布:网络审核员天河 编辑:程序博客网 时间:2024/05/22 14:22

面向对象程序设计(Object-oriented programming,OOP)

特征:封装/继承/多态/抽象

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

js只有2种作用域

  1. 局部

  2. 全局

    ES6: let 块级作用域

  1. 如果在块中,没有var声明,都会自动提升为全局变量
  2. 局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部

作用域链(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.prototypeStudent.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

阅读全文
0 0
原创粉丝点击