> 文档中心 > 【js高级 之创建对象的四种方式】

【js高级 之创建对象的四种方式】

目录

一、js的基本创建方式?

二、工厂模式

三、构造函数模式

四、原型模式


一、js的基本创建方式?

方式一:

var  s1=new Object()

s1.name="王一";

s1.age=22;

s1.run=function(){

console.log(this.name+"正在跑")

}

方式二:

var s1={   name:"王一",   age:22,   run:function(){  console.log(this.name+"正在跑")     }}s1.run()//王一正在跑

优点:简单、方便 ,缺点:无法量产

每次创建都要写出对象的所有属性和方法

二、工厂模式创建对象

 //创建一个学生对象: 名称 年龄  方法:吃饭 //创建10个  //利用函数来创建对象  工厂模式 function createStudent(name,age){     var s=new Object()//{}     s.name=name     s.age=age     s.eat=function(){  console.log(this.name+"正在吃")     }     return s } var s1=createStudent("王一",21) console.log(s1) var result=s1 instanceof Student//判断类型的方法 console.log(result)//false s1.eat() var s2=createStudent("王二",22) console.log(s2)

    优点:可以量产对象
     缺点:通过工厂模式创建出来的对象,无法明确对应类型,无法用instanceof判断类型

注意:number string boolean  简单数据类型, 使用直接书写的方式无法名确对应类型

必须使用  new Number( )   new String()方式创建

// var num = new Number(123)---result---true var num = 123; var result = num instanceof Number console.log(result)//false

三、构造函数模式

 借鉴了其他语言创建对象方法, 创建类类:同一类型事物的总称 包含的属性和方法 都写到构造函数里js默认没有类这个概念构造函数模式:来模拟类!!! 利用js this指向的问题
 //创建学生类  属性 :名字  年龄  ,方法:学习function Student(name,age){     this.name=name     this.age=age     this.study=function(){  console.log(this.name+'正在学习')     } }  var s1=new Student("王一",21) var s2=new Student("王仁",21) var s3=new Student("王四",23)s1.study()//王一正在学习 //不同对象的study方法,都存到了不同的地址 //公用的方法,没有封装!!!
 构造函数模式的优点:明确了类型!!!    缺点:共用的方法,占据内存!!

new做了什么?

1.创建一个空对象 {}2.执行后面的构造函数,将函数内容this,指向空对象3.函数执行完成后,将创建的空对象返回给前方变量

四、原型模式创建对象

 在创建构造函数的过程中,将共有的方法放入构造函数的原型里
 function Student(name,age){     this.name=name     this.age=age } //prototype 设置原型对象 Student.prototype.study=function(){     console.log(this.name+"正在学习") }//实例化对象s1,s2 var s1=new Student("王一",21) var s2=new Student("王二",22) console.log(s1.eat==s2.eat)  //true //__proto__ 实例化对象的原型 //prototype 构造函数的原型 console.log(s1.__proto__==Student.prototype) //true // s1.eat() // s2.eat()//改变s1的原型对象  s1.prototype.study=function(){     console.log(this.name + "偷懒") }s1.study()//王一偷懒s2.study()//王二偷懒//那么问题来了,我只想单改一个实例化对象的原型study方法怎么办?//只需使用下面的方法   s1.study = function() {     console.log(this.name + "在做笔记") }    s1.study(); //王一在做笔记    s2.study(); // 王二正在学习这样实例化的s1会优先使用同名的 在原型外面的 study方法,就实现了单改s1的study方法

优点:相对于构造函数模式,将共用的方法放在原型里,节省了内存

注意:因为原型共用内存,一个实例化的study原型方法改变,构造函数的原型也就改变,其他实例化对象的原型随之改变