所有对象都是通过new 函数创建
所有的函数也是对象
函数中可以有属性
所有对象都是引用类型

函数是通过new Function创建的 如下图

函数是通过new Function创建的.jpg

普通对象是通过new 函数创建的 如下图

普通对象是通过new 函数创建的.jpg

prototype / 原型

所有函数都有一个属性:prototype,称之为函数原型

每个函数都有原型对象如下图

每个函数都有原型对象.jpg
默认情况下,prototype是一个普通的Object对象

默认情况下,prototype中有一个属性,constructor,它也是一个对象,它指向构造函数本身。

原型中的constructor指向函数本身 如下图

原型中的constructor指向函数本身.jpg

proto /隐士原型

所有的对象都有一个属性:__proto__,称之为隐式原型
默认情况下,隐式原型指向创建该对象的函数的原型。

隐式原型的指向 如下图

隐式原型的指向.jpg

当访问一个对象的成员时:

  1. 看该对象自身是否拥有该成员,如果有直接使用
  2. 在原型链中依次查找是否拥有该成员,如果有直接使用

    原型链的全貌 如下图

    链条的全貌.jpg

    特殊点:

  3. Function的proto指向自身的prototype

  4. Object的prototype的proto指向null

练习

1:

  1. function User() {}
  2. User.prototype.sayHello = function() {}
  3. var u1 = new User();
  4. var u2 = new User();
  5. console.log(u1.sayHello === u2.sayHello); //true
  6. console.log(User.prototype.constructor); //User Function
  7. console.log(User.prototype === Function.prototype); // false
  8. console.log(User.__proto__ === Function.prototype); // true
  9. console.log(User.__proto__ === Function.__proto__); // true
  10. console.log(u1.__proto__ === u2.__proto__); // true
  11. console.log(u1.__proto__ === User.__proto__); // false
  12. console.log(Function.__proto__ === Object.__proto__); // true
  13. console.log(Function.prototype.__proto__ === Object.prototype.__proto__); // false
  14. console.log(Function.prototype.__proto__ === Object.prototype); // true

2:

  1. var F = function () {}
  2. Object.prototype.a = function () {}
  3. Function.prototype.b = function () {}
  4. var f = new F();
  5. console.log(f.a, f.b, F.a, F.b);
  6. // fn undefined fn fn

3:

  1. function A() {}
  2. function B(a) {
  3. this.a = a;
  4. }
  5. function C(a) {
  6. if (a) {
  7. this.a = a;
  8. }
  9. }
  10. A.prototype.a = 1;
  11. B.prototype.a = 1;
  12. C.prototype.a = 1;
  13. console.log(new A().a); //1
  14. console.log(new B().a); //undefined
  15. console.log(new C(2).a); //2

笔记.md