【JS】对象-构造函数

137 阅读3分钟

一、概念

  1. 对象是一个实际的存在,构造函数是对对象的描述,相当于其他编程语言中的类
  2. 构造函数构造新对象,内部的语句将为新对象添加若干属性和方法
  3. 每一对象都有与之对应的构造函数
  4. 相同数据类型的对象,构造函数是同一个; 构造函数等价于数据类型

二、构造函数和对象的关系

  1. 对象是构造函数的实例,构造函数是对象的抽象(描述)
  2. 一个构造函数对应多个对象,一个对象只能有一个构造函数。

image.png

三、判断对象的构造函数(数据类型)

1. 运算符instanceof

运算符组成的表达式的值是布尔值,如果指定的对象是指定的构造函数的实例,结果是 true,否则 false。

该运算符可以用来判断对象类型数据的数据类型。

对象 instanceof 构造函数
console.log([] instanceof Array);   //true
console.log([] instanceof Function);//false

2. constructor属性

每个对象都有 constructor 属性,该属性的值就是该对象的构造函数

对象.constructor
对象['constructor']
console.log([].constructor);
console.log([]['constructor']);

四、实例化

  1. 根据构造函数创建出对象的过程称为实例化
  2. 使用 new 关键字进行实例化
  3. 一个构造函数,每一次实例化,都会创建一个新的对象,在内存中开辟新的空间,互相不相等
var arr = new Array();
var arr1 = new Array;
var arr2 = new Array(100, 233, 455)
console.log(arr);         //[]
console.log(arr1);        //[]
console.log(arr2);        //[100,233,455]
console.log(arr == arr1);//false

五、自定义构造函数

定义一个构造函数与定义一个普通函数是一样的,我们通常会把构造函数的名字首字母大写,以示区别。

// 构造函数 描述对象 构造函数可以规定它的实例有哪些属性(方法)
function User(name, age, address) {
  // 规定 User 的实例的属性 使用 this, this 表示构造函数的实例
  this.name = name;
  this.age = age;
  this.getInfo = function () {
    // 方法中也可以使用 this
    console.log('我的名字是:' + this.name + ',我的年龄:' +
      this.age);
  };
}
var user1 = new User('xxx', 12)
user1.getInfo()
  1. 实例化的时候,构造函数中的代码会执行; 每实例化一次,就执行一次
  2. 构造函数中的 this 表示所创建的实例(对象)
  3. 构造函数中的 return :
    • 没有return 或者 return 的是原始类型数据,对实例化的结果没有影响。
    • 如果 return 的是对象类型的数据,实例化的结果就是该 return 的值。

六、构造函数和函数

一个函数如果被调用就是作为函数使用;如果被实例化就是作为构造函数使用。都会执行,但得到的结果不同

var product = function() {
console.log('function product 执行了');
return 1000;
}
// 调用 product() product() 就是普通函数
var res1 = product();
console.log(res1); // 1000
// 实例化 product() product() 就是构造函数
var res2 = new product();
console.log(res2); // 对象(product类型的对象 product{})(product的实例)

七、原始类型数据的对象特性

  1. 原始类型中的 number、string、boolean,既有原始状态,又有对象状态,可以在两种状态间自动切换

    null 和 undefined 表示虚无,不是对象

  2. 作为原始值使用,会切换到原始状态; 如果作为对象使用,切换为对象状态

  3. 直接量方式、Number()函数创建的字符串,默认是原始状态; Number() 构造函数创建的字符串默认是对象状态

// 创建 String 类型的数据
// 第一种 直接量方式 使用单引号或双引号
var msg01 = 'hello world';
// 第二种 String() 函数
var msg02 = String('hello document');
// 第三种方式 String() 构造函数
var msg03 = new String('hello JS');
console.log(msg01); // 原始形态 hello world
console.log(msg02); // 原始形态 hello document
console.log(msg03); // 对象形态String [String: 'hello JS']
console.log('');
// 此时会自动将原始形态的 msg01 转换为对象形态
console.log(msg01.constructor); //ƒ String() { [native code] }
// 将对象形态的msg02 作为原始值使用,自动转为原始形态
console.log(msg03 + msg02); //hello JShello document