文章目录

  • 前言
  • 面向对象的编程:从宏观出发,以对象作为业务研究根据,解决相对应的问题
  • 一、javascript创建对象的几种方式
  • 二、使用步骤
  • 1.直接创建
  • 2.工厂模式
  • 3.构造函数
  • 4.原型创建


前言

面向对象的编程:从宏观出发,以对象作为业务研究根据,解决相对应的问题

一、javascript创建对象的几种方式

一、直接创建
二、工厂模式
三、构造函数
四、原型创建

二、使用步骤

1.直接创建

代码如下(示例):

var student={
		    name:'王一',
		    age:21,
		    eat:function(){
		        console.log(this.name+"正在吃")
		    }
		}
 var s1={
            name:'王二',
            age:22,
            eat:function(){
                console.log(this.name+"正在吃")
            }
        }
        console.log(s1)//{name:王二,age:21,eat:f}
		console.log(student);//object

优点:创建简单,可以随时用
缺点:无法量产,浪费空间

2.工厂模式

重复的创建对象,需要时可以随时调用
typeof 返回对应变量的数据类型 返回根本数据类型 字符串 object
instanceof 检测变量的数据类型 ,对应变量必须为原型创建出来的 返回值为true/false

代码如下(示例):

function Student(name,age){
            var s=new Object()
            s.name=name
            s.age=age
            s.eat=function(){
                console.log(this.name+'正在吃')
            }
            return s
        }
        function Teach(name,age){
            var t=new Object()
            t.name=name
            t.age=age
            t.eat=function(){
                console.log(this.name+'正在吃')
            }
            return t
        }
        var s1=Student("王一",21) //object
        var s2=Student("王二",10)
        var t1=Teach("张三",30)
        // 判断是否属于老师 
        console.log(t1 instanceof Teach)//false object类型无法判断属于哪个      
        console.log(s1)
        console.log(s2)
        // var arr=[1,2,3]
        //console.log(arr)//arr变量  检测arr变量是否为数组类型
        // var num=10
        // var num=new Number(10)       
        // //console.log(typeof(num)) //object number  
        //  console.log(num instanceof Object)//T

优点:可以对单个对象量产;
缺点:无法明确对象的类型 ,全都是object类型的,无法对类型进行细分


3.构造函数

代码如下(示例):
构造函数和工厂模式的区别在于,它使用了new运算符,在内部使用this指向当前对象,而且解决了对象类型的识别问题

// this指向 对象 window  固定对象   事件源
        // this指向运行环境
        // window对象
        function fun(){
             console.log(this)//window
        }
        fun()
function Student(name,age){
            this.name=name
            this.age=age
            this.eat=function(){
                console.log(this.name+"正在吃")
            }
        }
        function Teach(name,age){
            this.name=name
            this.age=age
            this.eat=function(){
                console.log(this.name+"正在吃")
            }
        }
        // 通过new来创建对象  new做了什么?
        // 1.创建一个空对象 {}
        // 2.在执行函数的过程中 ,函数内部 this指向创建出来的{}    this={} {name:"王一",age:21,eat:function(){}}
        // 3.将创建对象 返回出来,赋值给前方变量
        var s1=new Student("王一",21)
        var s2=new Student("王二",22)
        console.log(s1)
        console.log(s2)
       // console.log(s1.__proto__==s2.__proto__)false
       //s1中eat方法  s2也有eat方法  造成内存的消耗

构造函数创建对象
好处:可以明确对应的对象类型
弊端:不同对象中的相同方法,无法公用,需要独立存储,造成内存损耗

4.原型创建

代码如下(示例):
在创建一个函数的时候,内部会出现一个特殊的属性:prototype.这个属性指向构造函数的原型对象,包含了使用方法和共享属性,可以
发现 每一类相同的对象 ,原型对象都是一个样 ,想办法将公有的方法 放到原型中
将共有的方法放入构造函数的原型中

function Student(name,age){
            this.name=name
            this.age=age;
}
Student.prototype.eat=function(){
            console.log(this.name+'正在吃')
			console.log(this.hp--)
}	
var s1=new Student("王一",21)	
s1.eat();
var s2=new Student("王二",22)
s2.eat()

优点·:解决了属性或方法不能共享的问题,,解决了内存的问题;简便好用
缺点:构造函数是空的没有传递参数,所有的属性和方法都在原型上,某个实例无法特有自己的属性和方法,更改一个属性方法,所有对象的属性都会发生变化。