一、构造函数

构造函数与普通函数唯一的区别就是调用方式不同。除此之外,构造函数也是函数。并没有把某个 函数定义为构造函数的特殊语法。任何函数只要使用 new 操作符调用就是构造函数,而不使用 new 操 作符调用的函数就是普通函数。

  1. function Person(name, age, job) {
  2. this.name = name;
  3. this.age = age;
  4. this.job = job;
  5. this.sayName = function() { alert(this.name) }
  6. }
  7. // person1 和 person2 都是 Person 的实例
  8. var person1 = new Person('phy', 28, 'developer');
  9. var person2 = new Person('zsl', 28, 'Doctor');
  10. // 实例的构造函数属性(constructor)指向构造函数。
  11. console.log(person1.constructor === Person); //true
  12. console.log(person2.constructor === Person); //true


二、原型对象

无论何时,只要创建一个函数,就会按照特定的规则为这个函数创建一个 prototype 属性(指向 原型对象)。

  1. console.log(typeof Function.prototype) // Function,这个特殊
  2. console.log(typeof Object.prototype) // Object
  3. console.log(typeof Function.prototype.prototype) //undefined

三、proto(隐式原型)

实例通过proto链接到原型对象

  1. let a = 1;
  2. console.log(a.__proto__ === Number.prototype) // true
  3. console.log(a.__proto__.__proto__ === Object.prototype) // true
  4. console.log(a.__proto__.__proto__.__proto__ === null) // true
  5. let b = function(){};
  6. console.log(b.__proto__ === Function.prototype) // true
  7. console.log(b.__proto__.__proto__ === Object.prototype) // true
  8. console.log(b.__proto__.__proto__.__proto__ === null) // true

四、构造器

  1. Number.__proto__ === Function.prototype // true
  2. Number.constructor == Function //true
  3. Boolean.__proto__ === Function.prototype // true
  4. Boolean.constructor == Function //true
  5. String.__proto__ === Function.prototype // true
  6. String.constructor == Function //true
  7. // 所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身
  8. Object.__proto__ === Function.prototype // true
  9. Object.constructor == Function // true
  10. // 所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身
  11. Function.__proto__ === Function.prototype // true
  12. Function.constructor == Function //true
  13. Array.__proto__ === Function.prototype // true
  14. Array.constructor == Function //true
  15. RegExp.__proto__ === Function.prototype // true
  16. RegExp.constructor == Function //true
  17. Error.__proto__ === Function.prototype // true
  18. Error.constructor == Function //true
  19. Date.__proto__ === Function.prototype // true
  20. Date.constructor == Function //true

JavaScript中有内置(build-in)构造器/对象共计12个(ES5中新加了JSON),这里列举了可访问的8个构造器。剩下如Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math,JSON是以对象形式存在的,无需new。它们的proto是Object.prototype。如下

  1. Math.__proto__ === Object.prototype // true
  2. Math.construrctor == Object // true
  3. JSON.__proto__ === Object.prototype // true
  4. JSON.construrctor == Object //true

N、new操作符

  1. 在内存中创家奴一个新对象。
  2. 这个新对象内部的prototype特性被赋值为构造函数的prototype属性。
  3. 构造函数内的this被赋值为这个新对象(即this指向新对象)。
  4. 执行构造函数内部的代码(给新对象添加属性)。
  5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

    参考链接

相关文章


typeof/instanceof