review0604
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JavaScript面向对象</title></head><body></body><script type="text/javascript"> // JavaScript对象声明的六种方式 // 一、字面量声明 // 通过obj.属性名或obj.方法名()就可以读取或调用对象的属性/方法了 var obj = { name1 : value1, name2 : value2, name3 : value3, fn1 : function(){}, fn2 : function(){} } // 二、用new操作符构造Object对象 // 首先用new Object()创建一个空对象,然后用多条语句给对象添加属性/方法。 var obj = new Object(); obj.name1 = value1; obj.name2 = value2; obj.name3 = value3; obj.fn1 = function(){}; obj.fn2 = function(){}; // 三、用函数声明的方式构造对象 // 通过这种方式声明的对象,每一次new出来的对象都是独立的,互相不会有影响,属性、方法中的this指向的就是新创建的、调用他们的对象。 function person(name,age){ this.name = name; this.age = age; this.say = function(){ console.log('My name is' + this.name + ', I\'m' + this.age + 'years old'); } } var xiaoMing = new person('xiaoMing',16); xiaoMing.say();//"My name is xiaoming, I'm 16 years old" // 四、工厂模式声明对象 // 每一次调用function 声明的函数时,它在内部new Object(),最后将这个新建的对象return回来,调用时就像普通函数调用一样,实例化的时候不用再new了(内部new过)。虽然多次调用该函数走的都是一样的流程,但是生产出来的两个产品互不影响。 function person(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj.say = function(){ console.log('My name is' + obj.name + ', I\'m' + obj.age + 'years old'); }; return obj; } var xiaoMing = person('xiaoMing',16); xiaoMing.say();//"My name is xiaoming, I'm 16 years old" var xiaoHong = person('xiaoHong',18); xiaoHong.say();//"My name is xiaoming, I'm 18 years old" // 五、原型方式声明对象 // 原型方式是将该对象的属性/方法写在他的prototype属性所指的对象上。 // 这有点像JS上常说的事件代理/委托。事件不直接绑定在该DOM元素上,而是绑定在它的父级元素,当给该DOM元素添加兄弟元素时,兄弟元素因为冒泡,能触发相同的事件。 function person() {/*空*/}; person.prototype.height = "1.80m"; person.prototype.grade = "Senior 3"; person.prototype.say = function() { console.log( 'I\'m ' + this.height + ' tall and I\'m in '+ this.grade); } var xiaoMing = new person(); xiaoMing.say(); //"I'm 1.80m tall and I'm in Senior 3" // 六、混合模式 // 混合模式可以理解成原型模式+构造函数 // 对比混合模式和原型模式可以发现,混合模式函数体不是空的,而函数体内的内容就是前边说的构造方式。 function person(name, height) { this.name = name; this.height = height; }; person.prototype.age = 18; person.prototype.grade = "Senior 3"; person.prototype.say = function() { console.log('Hello, my name is ' + this.name + '. I\'m ' + this.age + ' years old, ' + this.height + ' tall and I\'m in '+ this.grade + '.'); } var xiaoMing = new person('Xiaoming', '1.80m'); xiaoMing.say();//"Hello, my name is Xiaoming. I'm 18 years old, 1.80m tall and I'm in Senior 3." var xiaoHong = new person('Xiaohong', '1.65m'); xiaoHong.say();//"Hello, my name is Xiaohong. I'm 18 years old, 1.65m tall and I'm in Senior 3." // 闭包 // 闭包是一个拥有很多变量和绑定了这些变量的环境的表达式(通常就是一个函数) function a(){ var i= 0; function b(){ alert(++i); } return b; } var c = a(); c();//特点:函数b实在a内嵌套的,函数a需要返回函数b //用途:1、读取函数内部变量 2、让i变量得值保存在内存中 function f1(){ var n = 99; nAdd = function (){ n=n+1; } function f2(){ alert(n); } return f2; } var rs = f1(); rs();//99 nAdd(); rs();//100 -- rs就是f2函数的闭包函数</script></html>
review0605
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>review0605</title></head><body></body><script type="text/javascript"> // 封装 function A(){ function _xx(){ alert(111); } this.xx = function(){ return _xx; } } A.prototype = { oth:function(){ alert(222); } } var a = new A(); alert(a.xx()()); a.oth(); // 继承 案例一 var person = function(){ person.prototype.say = function(){ alert(333); } } person.prototype.salary = 500; var programmer = function(){} programmer.prototype = new person(); programmer.prototype.wcd = function(){ alert(444); } programmer.prototype.salary = 1000; var p = new programmer(); p.say();//可以调用 p.wcd();//可以调用 // 继承 案例二 function person(name,age){ this.name = name; this.age = age; } person.prototype.sayHello = function(){ alert('属性值name:' + this.name); } function student(){}; student.prototype = new person('lisi',18); student.prototype.grade = 3; student.prototype.test = function(){ alert(this.grade); } var s = new student(); s.sayHello(); alert(s.grade); // 构造继承 function parents(name){ this.name = name; this.say = function(){ alert('父亲的名字:' + this.name); } } function child(name,age){ // 继承parent this.pObj = parents; // 子对象的参数name传递到父对象中 // 用父对象来创建子对象 this.pObj(name); // parents(name) this.age = age; this.sayC = function(){ alert('child:' + this.name + ' ' + 'age:' + this.age); } } var p = new parents('zhangsan'); p.say(); var c = new child('lisi',20); c.sayC(); // call apply function parents(name,age,len){ this.name = name; this.age = age; this.len = len; this.say = function(){ alert(this.name + this.age + this.len); } } //call继承 function student(name,age){ parents.call(this,name,age); } //apply继承 function teacher(name,age,len){ parents.apply(this,[name,age,len]); } //实例化 var per = new parents('zhangsan',25,180); per.say(); var stu = new student('lisi',20); stu.say(); var tea = new teacher('wangwu',28,178); tea.say(); // 多继承 function fun1(){ fun2.call(this); fun3.apply(this,['play','aa']); } function fun2(){ this.name = 'zhangsan'; this.eat = function(){ alert('eating'); } } function fun3(paly,name){ this.paly = play; this.name = name; } var car = new fun1(); alert(car.name); alert(car.play); car.eat(); // 对象冒充 function person(name,age){ this.name = name; this.age = age; this.sayHi = function(){ alert('Hello world!'); } } person.prototype.walk = function(){ alert('walk around'); } function student(name,age,grade){ this.newObj = person; // 冒充person对象 传递特权属性和特权方法给子类 this.newObj(name,age); this.grade = grade; } var stu1 = new student('zhangsan',15,5); alert(stu1.grade); alert(stu1.age); alert(stu1.name); alert(stu1.sayHi); stu1.walk();//调用共有方法是报错的 // 注意:stu1 继承了person的特权属性和特权方法,但是没有继承共有属性和共有方法</script></html>