首页 > 编程 > JavaScript > 正文

JavaScript面向对象之对象创建

2019-11-06 06:38:11
字体:
来源:转载
供稿:网友

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.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表