创建对象的方法与对象属性的继承


前言

在js中有很多创建对象的方法,对象是在js中非常常用的,本文章将讲解对象如何创建,创建对象时里面出现的问题,还有对象属性的继承


一、创建对象的方法

1.1 Object方法

let  p = new Object(); 
     p.name='123';
     console.log(p);
下面时运行结果

运行的结果

1.2 采用工厂函数法

 采用工厂函数可以批量生产对象
function person(name,age,sex){
          let p = new Object()
          p.name=name;
          p.age=age;
          p.sex=sex;
          p.chifan=function(){
            console.log('吃饭');
          }
          return p;
}

let  p1 = new person('小明','13','男')
console.log(p1);
let p2 = new person('小李','15','女')
console.log(p2);
下面时工厂函数的结果

在这里插入图片描述
虽然工厂函数生产的对象属性名和方法名相同,但是他们不是同一个对象接下来是代码验证

console.log(p1==p2);
console.log(p1.chifan==p2.chifan);

在这里插入图片描述
在这里面会存在一个问题,就是我们每次生产一个对象都会生产同样的函数,这样会造成内存上的浪费,那么我们怎么处理这个问题,我们留下这个问题把他放在之后解决

1.3 使用new 一个构造函数法

首先在写代码之前我们要先了解new 和this的作用
1.创建了一个空对象
2.调用了构造函数
3.将构造函数中的this指向指向了当前创建的实例化对象
4.执行了构造函数中的内部代码
5.返回了 this
我们说一下这里this的意思 在构造函数中指向的是它的实例化对象
接下来是代码演示

function person(name,age,sex){
    this.name =name ;
    this.age=age;
    this.sex=sex;
    this.chifan=function(){
        console.log('吃饭');
    }
}
let p = new person('里斯','12','男的')
let p1 = new person('小李','15','女的')
console.log(p);
console.log(p1)
下面是结果

在这里插入图片描述
当然这里也遇见了我们之前提到的问题那么我们就在这里处理上面说到的那个问题,首先要先了解一个概念如果构造函数想要访问原型的要构造函数.prototype,如果实例对象想要访问原型的话格式是:实例对象.__proto __,接下来我们代码操作时间.

function person(name,age,sex){
    this.name =name ;
    this.age=age;
    this.sex=sex;
}
person.prototype.chi=function(){
    console.log('chi');
}
let p = new person('里斯','12','男的')
let p1 = new person('小李','15','女的')
console.log(p);
console.log(p1);
p.__proto__.chi()
下面是运行结果``

在这里插入图片描述

二、对象属性的继承

需求分析

每个人都有名字年龄性别,如果我们给每个对象都去定义这些属性,会导致我们的代码量大大增加,对象的属性继承是为了减少我们的代码量,将相同的变量都定义在一个构造函数中

2.1.call方法

call方法() 借用
方法的使用语法格式:
构造函数.call(对象,参数,参数,…)
call方式的作用是什么??
1.可以修改this指向 => call 方法中的第一个参数是什么,就会将前边的构造函数中的this指向修改成什么
2.可以调用函数

function person(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex
}

function teacher(name,age,sex,tcid){
    person.call(this,name,age,sex)
    this.tcid=tcid
}
function stu(name,age,sex,classid){
    person.call(this,name,age,sex)
     this.classid=classid;
}
let tc1=new teacher('黎明','12','男','23');
let stu1 = new stu('丹尼','3','女','203210234')
console.log(tc1);
console.log(stu1);

2.2 applyf方法

apply()方法
(1) 他会改变this指向
(2)会调用函数
语法格式: apply(改变this指向,数组)需要注意他是以数组传参的

function person(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex
}

function teacher(name,age,sex,tcid){
    person.apply(this,arguments)
    this.tcid=tcid
}
function stu(name,age,sex,classid){
    person.call(this,arguments)
     this.classid=classid;
}
let tc1=new teacher('黎明','12','男','23');
let stu1 = new stu('丹尼','3','女','203210234')
console.log(tc1);
console.log(stu1);
下面是运行效果

在这里插入图片描述## 2.3 bind方法
(1)bind方法并不会执行函数
(2) 能够改变this指向
(3)如果不修改this指向他会返回一个他原来的函数 一般用于改变this指向

<div class="box">

</div>
<button id="btn">点击</button>
    <script>
   let btn = document.getElementById('btn');
    let box = document.querySelector('.box')

    btn.onclick=function(){
        let div=  document.createElement('div')
         box.append(div)
       div.onclick=function(){
        console.log(this);
       }.bind(this)  
    }
</script>
下面是效果演示

在这里插入图片描述

总结

一般常用的创建对象的方法就是工厂函数法和new构造函数法,工厂函数可以批量生产对象,对象属性的继承也很重要,可以大大减少我们的代码量

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值