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>