首页 > 代码库 > javascript面向对象
javascript面向对象
我们知道,要创建一个对象我们可以用如下代码:
var user = new Object();
user.name = ‘编程浪子‘;
user.age = 22;
user.address = ‘四川成都‘;
用这样的方法创建对象比较简单直观,也是JavaScript种创建对象最基本的方法。但是这样就有一个问题,如果我们需要创建多个对象,那么我就得写很多重复的代码。比如我们想创建另一个对象user1,我们就得重新将上面的代码重新写一遍,这在实际开发过程中是不合适的,这样如果对象过多,代码量将大大增加。
为了解决这样的问题,我们可以使用一种叫做**工厂模式**的方法,这种方法 就是为了解决实例化对象产生大量重复代码的问题。
工厂模式
function create(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.show = function () {
return this.name +‘ ‘+ this.age;
};
return obj;
}
var obj1= create(‘bclz‘, 30); //第一个实例
var obj2= create(‘bcxb‘, 20); //第二个实例
alert(obj1.show()); alert(obj2.show());
构造函数(构造方法)
function User(name, age) {//构造函数模式
this.name = name;
this.age = age;
this.show = function () {
return this.name + ‘ ‘+this.age;
};
}
创建对象的时候用new运算符就可以了:
var user1 = new User(‘bclz‘, 30); //第一个实例
var user2 = new User(‘bcxb‘, 20); //第二个实例
**使用new运算符**
var user = new Object(); //使用new运算符创建一个对象
user.name = ‘编程浪子‘; //给对象添加属性
user.age = 22; user.address = ‘四川成都‘;
**简单方式(传统赋值方式)**
var user = {};
user.name = ‘编程浪子‘; //给对象添加属性
user.age = 22;
user.address = ‘四川成都‘; **属性的调用**
对于对象属性的调用有两种方式: 调用方法如下:
alert(user.name + " " +user.age);//返回 ‘编程浪子 四川成都‘
另一种方法: alert(user[‘name‘] + " " +user[‘age‘]);//返回 ‘编程浪子 四川成都‘
**添加方法**
var user = {
name:‘编程浪子‘, //给对象添加属性
age:22,
address:‘四川成都‘,
showInfo:function(){//添加一个方法
alert(this.name+" "+this.age+" "+this.address);
},
showHello:showHello//将对象外部的方法添加到对象
};
function showHello(){
alert("Hello!");
}
user.showInfo();//调用方法 user.showHello();
function Cat(name,color){
this.name = name;
this.color = color;
this.type = "猫科动物";
this.eat = function(){alert("吃老鼠");};
} 生成实例:
var cat1 = new Cat("大毛","黄色");
var cat2 = new Cat ("二毛","黑色");
alert(cat1.type); // 猫科动物 cat1.eat(); // 吃老鼠
表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。 那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容, 每一次生成一个实例,都必须为重复的内容,多占用一些内存。 这样既不环保,也缺乏效率。
alert(cat1.eat == cat2.eat); //false
**javascript高级程序设计**
书中对与原型的描述和说明
function Person(){ } //创建Person构造函数
Person.prototype.name = "Nicholas";//创建共享属性name
Person.prototype.age = 29; //创建共享属性age
Person.prototype.job = "Software Engineer"; //创建共享属性job
Person.prototype.sayName = function(){
//创建共享函数sayName alert(this.name);
};
//分别创建了person1和person2,里面都有sayName函数,并且弹出的值都是一样
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true ·
alert(Person.prototype.isPrototypeOf(person1)); //true
alert(Person.prototype.isPrototypeOf(person2)); //true
function User(){};
var person3 = new User();
alert(Person.prototype.isPrototypeOf(person3)); //false
alert(User.prototype.isPrototypeOf(person3)); //true
### 基本原型 ###
function Person(){ }
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
### 更简单的方式 ###
function Person(){ }
Person.prototype = {
name : "Nicholas", age : 29, job: "Software Engineer",
sayName : function () {
alert(this.name);
}
};
function Person(){ }
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
friends : ["Shelby", "Court"],
sayName : function () {
alert(this.name);
}
};
var person1 = new Person();
var person2 = new Person();
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Court,Van" alert(person2.friends); //"Shelby,Court,Van"
alert(person1.friends === person2.friends); //true
上面的列子很容易看出,讲属性写在原型中的问题,列子中的friends是个数组,引用数据类型在person1中修改了friends,添加了一个条数据之后,可以看到person1和person2对象的friends都发生了改变,这其实很好理解,因为prototype对象本身就是共享的,数组又是属于引用类型,改变了一个,其他的都会发生改变。
### 构造函数与原型结合的方式 ###
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van" alert(person2.friends); //"Shelby,Count"
alert(person1.friends === person2.friends); //false alert(person1.sayName === person2.sayName); //true
### 动态原型模式 ###
function Person(name, age, job){
//属性 this.name = name;
this.age = age;
this.job = job;
//方法 if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("Nicholas", 29, "Software Engineer"); friend.sayName();
javascript面向对象