面向对象 - day02

创建对象:

  new运算符: 1. 执行函数    2. 自动创建一个空对象  3. 把空对象指向另一个对象    4. this绑定到这个空对象   5. 隐式返还this 

原型链:  链上都是对象,有限长度 (终点是 null)

  var obj = new Object();

  var Tab = function (){}

  var tab1 = new Tab();

  1.  访问对象原型:obj.__proto__

  2. 构造函数访问原型:Tab.prototype 

  3. 原型链: tab1.__proto__      (tab1.__proto__).__proto__      ((tab1.__proto__).__proto__ ).__proto__ 【Tab.prototype  Object  null 】

  4. 原型链的终点是: null  (会不会很惊讶)

构造函数判断类型:

  tab1.__proto__.constructor.name  // Tab

  tab1.__proto__.__proto__.constructor.name  // Object

  tab1.__proto__.__proto__ .__proto__  // null    Object.prototype.__proto__ == null

工厂模式:  像产品一样生产对象,函数return一个对象

  function createObj( name, age  ){

    var obj = new Object();

    obj.name = name;

    obj.age = age;

    return obj;

  }

构造函数模式: 

  方法一: var obj = new Object(); // 构建原生对象

  方法二:

    function Product( name ){

      // var obj = new Object();  隐式创建空对象  且  this绑定到这个空对象

      this.name = name;

      this.num = 0;

      // return this;   隐式返还 this

    };

    Product.prototype.add = function(){  // Product.prototype 创建了一个公共空间

      this.num++;

      console.log(this.num);

    };

    // Product.prototype  对象,默认只有一个属性  constructor;  可以往对象里添加新的属性

     Product.prototype.constructor  === Product   // true  任何对象都有它的构造函数,任何函数的原型都是对象

    // 获得构造函数的原型:  Product.prototype;

    var prod1 = new Product(); 

    var prod2 = new Product();

    // Object.prototype.__proto_  === null

  // 类的继承, 在现有类的基础上定义新的类 (类共享数据结构的机制) --- 放在day03

  // 类的继承包含两部分: 构造函数内定义的属性   和  构造函数原型上定义的方法    ---> 属性 和 方法的继承

// 仿照一个 new 运算符  ---- myNew函数

function myNew( constructor, ...arg ){  --> 参数: 构造函数 和 参数

  let obj = {};

  constructor.call( obj, ...arg );

  obj.__proto__ = constructor.prototype;

  return obj;

}

    

  

  

  

猜你喜欢

转载自www.cnblogs.com/baota/p/12424147.html