js创建对象的8种方法及其优缺点总结

1.对象字面量形式;优点:对于创建单个对象简单方便,缺点,产生大量重复性代码,无法复用

var obj = {
	name:"xiaowang",
	age:22,
	sayName:function(){
	console.log(this.name);
	}
}
//还有一种使用new Object
var o = new Object();
o.name = "xiaowang";
o.age = 22;
o.sayName  = function(){
console.log(this.name);
}

2.工厂模式;优点:抽象了创建具体对象的过程,解决了创建多个相似对象的问题,但没有解决对象识别的问题,不知道一个对象的类型

function createObj(name,age){
	var o = new Object();
	o.name = name;
	o.age = age;
	o.sayName  = function(){
console.log(this.name);
};
return o;
}
//创建新对象时,不能使用new关键字
var obj1 = createObj("xiaoming",18);
var obj2 = createObj("xiaohong",17);

3.构造函数模式;缺点:方法不能复用,方法会在每个实例上重新创建一遍;优点:可以使用instanceof操作符来检测对象类型,但instanceof检测到父类也会返回true;

//函数名的首字母一般要大写,
function Person(name,age){
	this.name = name;
	this.age = age;
	this.sayName = function(){
		console.log(this.name);
	};
}
//创建实例对象,必须使用new关键字
var  p1 = new Person("xiaowang",22);
var  p2 = new Person("xiaosong",23);
//使用构造函数方式创建对象必须经历以下4个步骤
//1.创建一个新对象 2.将this指向新对象 3.为新对象添加属性和方法 4.返回新对象

4.原型模式;缺点:省略了为构造函数传递初始化参数这一环节,所有实例在默认情况都将取得相同的值,原型中所有属性会被共享;优点:借助for in和hasOwnProperty()可以确定属性到底是在对象中还是在原型中

function Person(){}
Person.prototype.name = "xx";
Person.prototype.age = 21;
Person.prototype.friends = [1,2,3];
Person.prototype.sayName = function(){
	console.log(this.name);
}
//创建实例
var p1 = new Person();
p1.name = "xiaogong";
console.log(p1.name);//xiaogong,p2的name仍然是xx
var p2 = new Person();
p2.friends.push(4);//如果是引用对象属性,p2的改变会反应到p1中

5.原型和构造函数组合模式;优点:方法复用(p1.sayName==p2.sayName),且无共享问题,使用最广泛

function Person(name,age){
	this.name = name;
	this.age = age;
	this.friends = [1,2];
}
Person.prototype.sayName = function(){
	console.log(this.name);
}
//创建实例
var p1 = new Person("mm",1);
var p2 = new Person("gg",2);

6.动态原型模式 优点:只用在方法不存在的情况下才会将它添加到原型中,只在初次调用构造函数时才会执行

function Person(name,age){
	this.name = name;
	this.age = age;
	//方法
	if(typeof this.sayName !=='function'){
		Person.prototype.sayName = function(){
			console.log(this.name);
	};
	}
}

7.寄生式构造函数模式;与工厂函数模式一致,但是新对象使用new关键字创造;基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象

function Person(name,age){
	var o = new Object();
	o.name = name;
	o.age = age;
	o.sayName  = function(){
console.log(this.name);
};
return o;
}
var p1 = new Person("xx",21);

8.稳妥构造函数模式:没有公共属性,其方法也不引用this对象,适合在一些安全的环境中,或防止数据被其他应用程序改动时使用;其与寄生构造函数类似,但是不使用this,也不使用new操作符调用构造函数

function Person(name,age){
	var o = new Object();
	//可在此处定义私有变量和函数
	//添加方法
	o.sayName = function(){
		console.log(name);
	}
	return o;
}
var friend = Person("x",21);
friend.sayName();//x
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值