创建对象的方式

本文详细介绍了JavaScript中创建对象的四种常见方式:构造函数、对象字面量、工厂函数和自定义构造函数。同时,探讨了实例成员与静态成员的区别,以及new关键字在构造函数中的作用。此外,还提到了构造函数可能导致的内存浪费问题,并指出原型对象可以作为解决方案。
摘要由CSDN通过智能技术生成

创建对象的几种方式

  • new Object() 构造函数
    // new Object()方法
    var person = new Object();
    person.name = "Bob";
    person.age = 19;
    person.sayName = function () {
        console.log(this.name);
    };
  • 对象字面量 {}
// 对象字面量方法 简化 new Object()方法
var person = {
    name: "Bob",
    age: 18,
    sayName: function () {
        console.log(this.name);
    }
};
  • 工厂函数
    函数名首字母不需大写,遵循驼峰命名
function createPerson(name, age) {
    //添加一个新对象
    var person = new Object();
    person.name = name;
    person.age = age;
    person.sayName = function () {
        console.log(this.name);
    };
    //必须设置返回值
    return person;
}
//生成真正对象
var person1 =createPerson("bbb",23);
console.log(person1);

内部也可以使用字面量方式

function createPerson(name, age) {
    //字面量方法添加一个新对象
    //必须设置返回值
    return {
        name: name,
        age: age,
        sayName: function () {
            console.log(this.name);
        }
    }
}
//生成真正对象
var person1 = createPerson("bbb", 23);
console.log(person1);
  • 自定义构造函数
    1. 构造函数名首字母大写
    2. 通过构造函数生成的实例是可以找到自己当初的构造函数
    3. constructor属性值就是生成这个对象的构造函数,可以通过对象名打点调用这个属性来查看原本的构造函数
    4. 判断一个对象的具体对象类型还是需要用instanceof进行判断更加准确,返回值是true和false
      console.log(person1 instanceof Person);
//自定义构造函数
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        console.log(this.name);
    };
}
//生成对象实例
var person1 = new Person("Bob", 25);

// new的作用
// 1. 在函数内部创建新对象
// 2. 将this指向新对象
// 3. 执行构造函数内部的新代码
// 4. 将新对象作为返回值

构造函数和实例对象的关系

  • 构造函数是根据具体的事物抽象出来的抽象模板
  • 实例对象是根据抽象的构造函数模板得到的具体实例对象
  • 每一个实例对象都通过一个 constructor 属性,指向创建该实例的构造函数
    注意:constructor 是实例的属性的说法不严谨,具体后面的原型会讲到
  • 可以通过 constructor 属性判断实例和构造函数之间的关系
    注意:这种方式不严谨,推荐使用 instanceof 操作符,后面学原型会解释为什么

静态成员和实例成员

  • 使用构造函数方法创建对象时,可以给构造函数和创建的实例对象添加属性和方法,这些属性和方法都叫做成员
  • 实例成员:在构造函数内部添加给 this 的成员,属于实例对象的成员,在创建实例对象后必须由对象调用。
  • 静态成员:添加给构造函数自身的成员,只能使用构造函数调用,不能使用生成的实例对象调用。
function Person(name, age) {
    //实例成员,通过生成的实例来调用,创建时直接添加到函数内部
    this.name = name;
    this.age = age;
    this.type = "human";
    this.sayName = function () {
        console.log(this.name);
    };
}
//静态成员,直接给构造函数添加的成员
Person.version = "1.0";

var person1 = new Person("Bob", 34);
//实例成员调用,打印出的是Bob
console.log(person1.name);
// 使用构造函数调用,调用不成功,打印出的是函数自己的name
console.log(Person.name);
//静态成员使用构造函数调用可以成功,实例调用会失败,打印出undefinded
console.log(Person.version);
console.log(person1.version);

构造函数的问题

浪费内存:使用原型对象可以更好的解决构造函数的内存浪费问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值