@guoxs
2015-07-07T15:28:15.000000Z
字数 2711
阅读 2999
JavaScript
1、面向过程编程
基本思想:以过程为重心,自顶向下逐步细化
程序—— 一系列函数调用的集合
语言:C、Fortran、Pascal……
2、面向对象编程
基本思想:对象作为程序的基本单元;程序分解为数据和相关操作
语言:smalltalk、JavaScript、C++……
基本概念:
- 类、对象
- 属性、方法
基本特征:
- 继承:父类与子类
- 封装:将用户可见与不可见的部分良好分开
- 多态:接口的不同实现方式,比如子类继承父类,就可以重写父类的方法,来实现不同的方法。
3、JS面向对象
constructor 构造器(构造类型)
① 对象创建过程:
var o = new Object(); //new后面的为constructorvar o = {x:1}//创建自定义构造器function Employee(name, company,salary){this.name = name; //this创建对象的属性this.company = company;this.salary = salary;this.changeSalary = funtion(salary){this.salary = salary;}}//创建对象var jim = new Employee('jim Green', 'NetEase',3000);//调用属性和方法jim.chagneSalary(4000);
② 三种常见构造器创建方式
function Employee() {} //函数的定义var Employee = function() {} //函数表达式var Employee = new Function(); //s使用new
所有函数都能被当成构造器?
var o = new Math.min(); //错//并不是所有JS中的函数都能当做构造器来使用,一般来数,用户自定义的,以及JS中内置的构造器都可以当成constructor
function Employee(name, company,salary){this.name = name;this.company = company;this.salary = salary;this.changeSalary = funtion(salary){this.salary = salary;}return {}; //constructor也是一个函数,可以有返回值}var jim = new Employee('jim Green', 'NetEase',3000);//当使用new构创建构造器时,如果构造器的返回值是一个对象类型的话,则直接将这个对象作为新创建的对象,其他的则为创建一个新对象。alert(jim.name); //undefined;因为在返回的空对象中没有name属性
③ this
1)全局环境中的this指向全局对象(window对象),这只是在浏览器环境中的,如果在Node.js中则不是window。
var a = 10;alert(this.a); //指向windowthis.b = 20;alert(b); //指向windowc=30;alert(this.c); //指向window
2)构造器中的this:指向将要创建出的新对象
function Person(name,age){this.name = name; //this指向将要创建出的新对象,因为使用构造器创建对象时会执行构造函数,而构造函数中的this指向要创建出来的对象this.age = age;this.sayHello = function(){alert('Hello,'+this.name);}}var p1 = new Person('lily','20');
3)函数中的this:指向函数的调用者
function Person(name,age){this.name = name;this.age = age;this.sayHello = function(){alert('Hello,'+this.name); //this指向p1}}var p1 = new Person('lily','20');p1.sayHello();
4)new function 中的this:全局对象(window)
(function(){var f = new Function('alert(this)'); //不管出现在哪里,使用new都指向全局对象windowf();})();function Foo(){this.bar = function(){var f = new Function('alert(this)'); //this指向全局对象windowf();}}var foo = new Foo();foo.bar();
5)eval中的this:调用上下文中的this
(function(){eval('alert(this)'); //在闭包中执行,上下文是global,this指代window对象})();function Foo(){this.bar = function(){eval('alert(this)'); //上下文是调用者,eval中的this为bar函数的调用者,即为Foo对象}}var foo = new Foo();foo.bar();
eval() 【evaluation:赋值】函数可计算某个字符串,并执行其中的的 JavaScript 代码。
this总结
| 场景 | 值 |
|---|---|
| 全局对象 | 全局对象(window) |
| constructor | 新创建出的对象 |
| 函数调用 | 函数调用者 |
| new Function | 全局对象(window) |
| eval | 调用上下文中的this |
6)apply与call
function Point(x,y){this.x = x;this.y = y';this.move = function(x,y){this.x += x; //this指向由pointthis.y += y; //this指向由point}}var point = new Point(0,0); //创建(0,0)点point.move(1,1); //将点移动到(1,1)var circle = {x:0,y:1.r:1}; //使用对象直接量,以(0,1)为原点换一个半径为1的圆point.move.apply(circle,[1,1]); //圆心移到(1,2);改变调用函数里的对象。改变函数中的this,this指向由point改为circlepoint.move.call(circle,1,1); //与apply类似,但是第二个参数有所不同。apply为一个数组[1,1],表示一起传入,而call为依次传入