有点慌,想谈个对象,嗯?谈对象?女朋友?nonono,女朋友什么的不,不存在的,学习使我快乐?玩程序的人最不缺的就是对象?没对象自己new一个啊!So ,easy?O(∩_∩)O哈哈~对象当然是JS中的对象:
1:什么是对象?
在w3c的文档中是这样解释的:ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。
在经典的面向对象语言中,对象是指数据和在这些数据上进行的操作的集合。与 C++ 、php、Java等语言 不同,JavaScript 是一种基于原型的编程语言,并没有 class 语句,而是把函数用作类。在JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...Js中的对象主要分为两大类:内置对象(比如我们熟悉的date,Math,String,Array等都是js的内置对象)和自定义对象。此文主要说的是自定义对象。
简单的说我认为对象就是:
1:JavaScript的一个基本数据类型,是一种复合类型,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。即一组值的无序集合。
2:拥有属性和方法的数据。
3:一种思考问题解决问题的思维(面向对象 )。
2:创建对象:
方式一:
创建语法:var 变量 = new Object();
实例:
var obj1=new Object();
//设置对象属性
obj1.name="青锋";
obj1.desc="三尺青锋";
//设置对象的方法
obj1.info=function(){
console.log("剑名:"+this.name+"介绍:"+this.desc);
}
//读取对象属性
console.log(obj1.name);
//调用对象方法
obj1.info();
方法一不足:仅仅只是创建了一个对象,如果需要多次创建对象,则需要重复代码多次,不利于代码的复用。
方式二:工厂模式:
所谓的工厂模式即:创建一个function(),在function内部new Object,通过function传入参数来动态的为对象设置属性然后return obj以此来达到可以批量创建对象的功能(通过function模拟了一个类)。
实例:
function createObj(name,desc){
var obj2=new Object();
obj2.name=name;
obj2.desc=desc;
obj2.info=function (){
console.log("剑名:"+this.name+"介绍:"+this.desc);
}
return obj2;
}
//实例化对象
var sword=createObj("轩辕剑","上古轩辕黄帝佩剑。"),
sword2=createObj("鱼肠剑","十大名剑之鱼肠剑。");
console.log(sword);
//读取属性
console.log(sword.name);
console.log(sword2.name);
//调用方法
sword.info();
sword2.info();
//打印对象类型
console.log("sword1类型:"+ typeof(sword));
console.log(sword instanceof Object);
工厂模式不足之处:当我们通过工厂模式创建多个对象后检测对象类型会发现创建的所有对象的对象类型均为object,无法识别对象的特定类型。并且工厂模式存在严重的内存浪费问题。
方式三:构造函数模式:
我们可以通过构造函数来创建对象,实例:
//创建pet类
function Pet(name,desc){
this.name=name;
this.desc=desc;
this.info=function(){
console.log("名称:"+this.name+"介绍:"+this.desc);
}
}
//创建per类
function Per(name,desc){
this.name=name;
this.desc=desc;
this.info=function(){
console.log("名称:"+this.name+"介绍:"+this.desc);
}
}
//实例化对象
var pet1=new Pet("朱雀","四灵之一,南方星圣。");
//读取属性
console.log(pet1.name);
//调用方法
pet1.info();
//检测类型
console.log(pet1 instanceof Object);//true
console.log(pet1 instanceof Pet);//true
console.log(pet1 instanceof Per);//false
构造函数模式与工厂模式的区别:
1:构造函数创建对象无须在函数内new Object。
2:构造函数创建对象无须return。
3:构造函数创建对象在实例化时必须new
构造函数模式的优点与不足:
优点:可以将实例标识为特定的类型,同时也属于Object类型,因为所有对象继承于Object。
缺点:使用构造函数创建对象每个对象都创建逻辑相同的方法存在浪费内存问题。
方式四:原型创建对象:
实例:
function Cat(){}
//原型属性
Cat.prototype.name="加菲猫";
Cat.prototype.desc="我是加菲猫哇";
//原型方法
Cat.prototype.info=function(){
console.log("名称:"+this.name+"介绍:"+this.desc);
}
//实例化对象
var cat1=new Cat(),
cat2=new Cat();
//读取对象属性
console.log(cat1.name);//加菲猫
//调用对象方法
cat1.info();
//重置属性
cat2.name="短耳猫";
console.log(cat2.name);//输出短耳猫而非加菲猫
原型模式不足之处:
prototype的属性和方法都赋给了新的对象意味着创建的对象拥有相同的属性和方法!原型模式的问题首先是构造函数不能传参,每个新创建的对象都具有相同的默认值。原型模式属性方法共享没有问题但所有对象共享了相同的属性。
方式五:构造+原型:
构造+原型模式的执行流程:
1:先查找构造函数里的属性和方法,如果有使用构造函数内的属性和方法。
2:如果构造函数里没有,那么会去它的原型对象里找,如果有使用原型里的属性和方法。
实例:
function Dog(name,desc){
//定义对象属性
this.name=name;
this.desc=desc;
}
//原型方式定义对象方法
Dog.prototype.info=function(){
console.log("名称:"+this.name+"介绍:"+this.desc);
}
//实例化对象
var dog1=new Dog("金毛","犬界暖男。");
//调用对象属性
console.log(dog1.name);
//调用对象方法
dog1.info();
优点:构造+原型模式创建对象是目前比较流行、常用的模式。实现了对象的属性私有而方法共享,属性私有后改变了各自的属性不会影响其他对象的属性,同时共用的方法由各个对象共享。在语义上,这符合了面向对象编程的要求。
3:字面量方式创建对象:
字面量方式创建对象 对象字面量是一个名值对列表,每个名值对之间用逗号分隔,并用一个大括号括起。各名值对表示对象的一个属性,名和值这两部分之间用一个冒号分隔。
实例:
var Pig={
//定义对象属性
name:"茶杯猪",
desc:"娇小可爱的茶杯猪",
//定义方法
info:function(){
console.log("名称:"+this.name+"介绍:"+this.desc);
}
}
//调用属性
console.log(Pig.name);
//调用方法
Pig.info();
缺点:此方式只能生成静态属性和方法。
注:关于对象还有很多很多未了解 的、想了解的、想谈的,要谈很久很久,路还长我们慢慢谈。愿你始终满目星辰,陪同梦想熠熠生辉。别忘了初心。