一.对比系统提供的构造函数和自定义的构造函数的区别。

1.系统提供的构造函数,数组为例

函数名等同于函数结构体。

  1. function Array() {} //作者默认提供的,如果手动写出来,作者的构造函数就被覆盖了。
  2. let arr = new Array(1, 2, 3); //arr:实例对象 Array:构造函数
  3. alert(Array); //function Array() { [native code] }
  4. console.log(arr.length); //3
  5. console.log(arr.push(4)); //4

2.自定义的构造函数

  1. function Person(name, age) {
  2. this.a = name; //属性
  3. this.b = age; //属性
  4. this.c = function() { //方法
  5. return `我的名字叫${this.a},我今年${this.b}岁`;
  6. };
  7. }
  8. let p1 = new Person('zhangsan', 18); //p1:实例对象 Person:类或构造函数 this->p1
  9. alert(Person); //输出当前Person函数结构体
  10. console.log(p1.a);
  11. console.log(p1.c());

3.实现作者的意图

作者默认提供的,如果手动写出来,作者的构造函数就被覆盖了。

  1. function Array() {
  2. this.length = arguments.length; //this指向实例对象,通过arguments对象实现作者提供的length属性。
  3. this.push = function() {
  4. return'我是push的返回值'
  5. }
  6. }
  7. let arr1 = new Array(1, 2, 3); //arr1:实例对象 Array:构造函数
  8. let arr2 = new Array(4, 5, 6, 7); //arr2:实例对象 Array:构造函数
  9. console.log(arr1.push == arr2.push); //false
  10. // 自己手动编写的Array构造函数,覆盖系统默认提供的构造函数,对比里面的方法返回false,使用系统的构造函数对比结果返回true
  11. // 可以证明系统的数组对象方法不是写在构造函数里面的,但是属性是写在构造函数里面的。

4.构造函数的弊端。

构造函数弊端:构造函数里面的属性和方法都是私有的(根据开发习惯,属性私有是正常的,而方法大部分都应该以公有为主(为了复用))