JavaScript面向对象之对象创建

1.创建对象:

var person = new Object();
person.name = "zhangsan";
person.age = 30;
person.job = "software engineer";

person.sayName = function(){
	alert(this.name);
}

person.sayName();

缺点:创造不同的对象需要大量重复的代码。


2.工厂模式:

function createObject(name,age,job){
	var o = new Object();
	o.name = name;
	o.age = age;
	o.job = job;
	o.sayName = function (){
		alert(this.name);
	}	
	return o;
}
var person1 = createObject("zhangsan",20,"teacher");
var person2 = createObject("lisi",30,"doctor");

person1.sayName();
person2.sayName();

缺点:无法判断对象的类型。alert(typeof person1);alert(person1instanceof Object);

3.构造函数模式:

(1)

function Person(name,age,job){
			
	this.name = name;
	this.age = age;
	this.job = job;
	this.sayName = function (){
		alert(this.name);
	};	
			
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");

person1.sayName();
person2.sayName();
alert(person1.sayName == person2.sayName);

缺点:sayName方法执行同样的任务,但创建不同的对象时却要不同的Function。

(2)
function Person(name,age,job){
			
	this.name = name;
	this.age = age;
	this.job = job;
	this.sayName = sayName;
			
}

function sayName(){
	alert(this.name);
}
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");

person1.sayName();
person2.sayName();
alert(person1.sayName == person2.sayName);

缺点:(2)虽然解决了(1)的问题,但sayName是一个全局函数,却只能被某个对象使用。如果对象由很多方法,就要定义很多全局函数,破坏了函数的封装性。

4.原型模式:

(1)

function Person(){
	
}

Person.prototype.name = "zhangsan";
Person.prototype.age = 30;
Person.prototype.job = "teacher";
Person.prototype.sayName = function(){
	alert(this.name);
};
		
var person1 = new Person();

person1.sayName();

var person2 = new Person();
person2.sayName();

alert(person1.sayName == person2.sayName);
(2)
function Person(){
	
}

Person.prototype = {
	name:"zhangsan",
	age:30,
	job:"teacher",
	friends:["lisi","wangwu"],
	sayName:function(){
		alert(this.name);
	}
};

		
var person1 = new Person();
var person2 = new Person();

person1.friends.push("zhaoliu");

alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);

缺点:由(2)可以看出原型的缺点,由于共享的特性,在使用基本类型时可以使用隐藏的手段解决,引用类型会造成共享问题。

5.组合构造函数模式和原型模式

function Person(name,age,job){
	this.name = name;
	this.age = age;
	this.job = job;
	this.friends = ["wangwu","zhaoliu"];
	
}

Person.prototype = {
	constructor:Person,
	sayName: function(){
		alert(this.name);
	}
};

		
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");

person1.friends.push("liuqi");

alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
6.动态原型模式
function Person(name,age,job){
	this.name = name;
	this.age = age;
	this.job = job;
	this.friends = ["wangwu","zhaoliu"];
	if(typeof this.sayName != "function"){
		Person.prototype.sayName = function (){
			alert(this.name);
		};
	}
	
}
		
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");

person1.friends.push("liuqi");

alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
7.寄生构造函数模式:

function Person(name,age,job){
	var o = new Object();
	o.name = name;
	o.age = age;
	o.job = job;
	o.friends = ["wangwu","zhaoliu"];
	o.sayName = function (){
		alert(this.name);
	};
	return o;
}
		
var person1 = new Person("zhangsan",20,"teacher");
var person2 = new Person("lisi",30,"doctor");

person1.friends.push("liuqi");

alert(person1.friends);
alert(person2.friends);
alert(person1.friends == person2.friends);
alert(person1.sayName == person2.sayName);
8.稳妥构造函数模式:

function Person(name,age,job){
	var o = new Object();
			
	o.sayName = function (){
		alert(name);
	};
	return o;
}
		
var person = Person("zhangsan",20,"teacher");
person.sayName();
特点:与寄生构造函数模式相似,不同点在于一是不使用new调用构造函数,二是在创建对象的实例方法中不使用this.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值