js创建对象

工厂模式

function fruit(kinds){
	var o=new Object();
	o.kinds=kinds;
	o.sayKinds=function(){
		console.log(this.kinds);
	}
	return o;
}
var orange=fruit('orange');
orange.sayKinds();//'orange'

工厂模式解决了创建多个相似对象的问题,但是却没有解决对象识别的问题


构造函数模式

function Shape(shape){
	this.shape=shape;
	this.drawShape=function(){
		console.log("画一个"+this.shape);
	}
}
var circle=new Shape('圆');
circle.drawShape();//'画一个圆''

构造函数和工厂模式的区别

没有显示的创建对象

直接将对象和属性赋值给了this

没有return语句 

 注意:构造函数始终应该以个大写字母开头

创建实例的时候使用到了new操作符,这种方式调用构造函数的过程

创建一个新的对象

将构造函数的作用域赋值给这个新对象

执行构造函数中的的代码(给这个新对象添加属性和方法)

返回这个新对象

 

构造函数和普通函数

任何函数通过new操作符来调用,都可以作为构造函数

而任何函数不通过new操作符调用,跟普通函数没有什么区别

构造函数的问题

每个方法都要在每个实例上重新创建一遍,函数没办法复用

 

原型链

function Animal(){
}
Animal.prototype.name='animal';
Animal.prototype.food='meat';
Animal.prototype.friends=['human'];
Animal.prototype.eat=function(){
	console.log(this.name+' eat '+this.food);
}
Animal.prototype.sayFriends=function(){
	console.log(this.friends);
}
var dog=new Animal();
dog.eat();//'animal eat meat'
dog.friends.push('duck');

var cat=new Animal();
cat.eat();//'animal eat meat'
cat.sayFriends();//["human", "duck"]

原型对象的问题

第一:省略了为构造函数传递初始化参数这一个环节,结果所有实例在默认情况下取相同的属性值

第二:原型中的所有属性都是共享的,对于值类型没有什么影响,但是对于引用类型来说,修改其中的一个实例的属性,另一个实例的属性也要被修改

组合使用构造函数和原型模式

function Person(name,age,job){
	this.name=name;
	this.age=age;
	this.job=job;
	this.friends=['didi','jiejie'];
}
Person.prototype={
	constructor:Person,
	sayName:function(){
		console.log(this.name);
	},
	sayFriends:function(){
		console.log(this.friends);
	}
}

var p1=new Person('meimei','18','student');
p1.sayName();//'meimei'
p1.friends.push('boyfriends');
p1.sayFriends();//["didi", "jiejie", "boyfriends"]

var p2=new Person('gege','19','teacher');
p2.sayName();//'gege'
p2.sayFriends();//["didi", "jiejie"]

实例属性都在构造函数中定义,由所有实共享的属性和方法都在原型中定义

 

动态原型模式

function Book(name){
	// 属性
	this.name=name;
	// 方法
	if(typeof this.sayName != 'function'){
		Book.prototype.sayName=function(){
			console.log(this.name);
		}
	}
}
var book=new Book('javascript');
book.sayName();

把所有的信息封装在构造函数中,而通过在构造函数中的初始化原型(仅在必要的情况下),又保持了构造函数和原型的有点


寄生构造函数模式

基本思想:创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象

function Student(kinds){
	var o=new Object();
	o.kinds=kinds;
	o.sayKinds=function(){
		console.log('I am  is a '+ kinds);
	}
	return o;
}
var graduteStudent=new Student('graduteStudent');
graduteStudent.sayKinds();

特点

第一:返回的对象与构造函数或者与构造函数的原型属性之间没有关系

第二:构造函数返回的对象与在构造函数外部创建的对象没有什么不同,不能用instanceof操作符来确定对象类型;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值