JavaScript-构造函数创建对象(类)

本文介绍了JavaScript中使用构造函数创建对象的方式,强调了构造函数在创建不同对象时能更好地区分类型。讨论了构造函数与普通函数在调用和this指向上的区别,并指出在构造函数中定义方法的两种常见缺点。此外,文章还探讨了如何通过原型对象解决这些缺点,解释了prototype属性以及如何通过__proto__访问,展示了如何通过原型对象为对象添加方法和变量,使得方法共享且不污染全局作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用工厂方法创建对象, 对象实例的类型都是Object,不容易区分对象。
比如,创建一个人的对象, 和创建一个狗狗的对象,打印出来对象的类型都是Object, 很难区分。
这种情况, 用构造函数方法创建对象, 就可以解决了。

注意: 创建构造函数, 习惯首字母大写。
构造函数和普通函数的区别:
调用: 普通函数直接调用, 构造函数需要使用new关键字来调用。
this: 1.当以函数的形式调用时, this是window。
2.当以方法的形式调用时, 谁调用方法this就是谁。
3.当以构造函数的形势调用时, this就是新创建的对象。

	  function Person(){
	  }
	//当做普通函数调用
	 var obj=Person();
	 //构造函数调用
	 var obj=new Person();
  • 构造函数创建对象(方法写在构造函数里,缺点:构造函数每执行一次, 就会创建一次方法。)
	  function Person(name,age,gender){
            this.name=name;
            this.age=age;
            this.gender=gender;
            // 方法写在里面
            this.sayName=function(){
                 console.log(this.name);
             }      
          }
    
          function Dog(name,age){
              this.name=name;
              this.age=age;
          }
         
          var obj=new Person("张三",18,"男");
          var obj1=new Person("李四",16,"男");
          
          var dog=new Dog("乐乐",2);
          obj.sayName();
          obj1.sayName();
          
          console.log(obj);
          console.log(obj1);
          console.log(dog);

        
  • 构造函数创建对象(方法写在构造函数外,缺点: 方法为全局方法,污染全局。)
	   function Person(name,age,gender){
            this.name=name;
            this.age=age;
            this.gender=gender;
            this.sayName=fun;   //方法写在外面
          }
    	 function fun(){
            console.log(this.name);
        }
          function Dog(name,age){
              this.name=name;
              this.age=age;
          }
          
          var obj=new Person("张三",18,"男");
          var obj1=new Person("李四",16,"男");
          
          var dog=new Dog("乐乐",2);
          obj.sayName();
          obj1.sayName();
          
          console.log(obj);
          console.log(obj1);
          console.log(dog);

    
  • 使用 instanceof可以检查一个对象是否是一个类的实例
	 /*检测对象是否是一个类的实例  instanceof*/
          console.log(dog instanceof Person);
          console.log(dog instanceof Dog);
           console.log(dog instanceof Object);
          console.log(obj instanceof Object);
     /*打印结果, false  true  true true*/
  • 构造函数创建对象改造(方法通过原型对象创建)

原型对象:prototype
我们所创建的每一个函数,解析器都会向函数中添加一个prototype属性。
指向构造函数的原型对象,我们可以通过__proto__来访问该属性。
构造函数.prototype.xxx , xxx可以是变量,可以是方法。执行过程中会先去对象中找方法或者变量, 找不到就会去原型里寻找。

	  function Person(name,age,gender){
            this.name=name;
            this.age=age;
            this.gender=gender;
          }
          function Dog(name,age){
              this.name=name;
              this.age=age;
          }
          
        /*为person添加统一的方法, 到原型对象中*/
        Person.prototype.sayName=function(){
            console.log(this.name);
        }
          var obj=new Person("张三",18,"男");
          var obj1=new Person("李四",16,"男");
          
          var dog=new Dog("乐乐",2);
          obj.sayName();
          obj1.sayName();
          
          console.log(obj);
          console.log(obj1);
          console.log(dog);

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值