• js面向对象(工厂模式、构造函数模式、原型模式、原型和原型链)


    1.封装

    2. 工厂模式

    1. function createCar(color, style){
    2. let obj = new Object();
    3. obj.color = color;
    4. obj.style = style;
    5. return obj;
    6. }
    7. var car1 = createCar("red","car1");
    8. var car2 = createCar("green","car2");

    3. 构造函数模式

    1. // 创建出来的对象和构造函数有紧密关联
    2. function CreateCar(color, style){
    3. this.color = color;
    4. this.style = style;
    5. }
    6. var car1 = new CreateCar("red","car1");
    7. var car2 = new CreateCar("green","car2");
    8. console.log(car1,car2);

    4. 原型模式

    5.构造函数模式

    构造函数与工厂模式的区别(显示)

    1. 没有显示的创建对象

    2. 直接将属性和方法赋值给了this对象

    3. 没有return语句

    6.构造函数创建对象内部的处理

    1. 创建一个新对象

    2. 将构造函数的作用域赋给新对象

    3. 执行构造函数中的代码

    4. 返回新对象

    7.面试题:如何区分数组和对象?为什么instanceof能区分数组和对象?

     instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值。

    如下,可以通过car1 instanceof CreateCar检验,CreateCar构造函数的prototype是否出现在对象car1的原型链中的任何位置 

    1. // 创建出来的对象和构造函数有紧密关联
    2. function CreateCar(color, style){
    3. this.color = color;
    4. this.style = style;
    5. }
    6. var car1 = new CreateCar("red","car1");
    7. var car2 = new CreateCar("green","car2");
    8. let arr = [1,2,3];
    9. let obj = {
    10. a:1
    11. };
    12. console.log(arr instanceof Array);// true
    13. console.log(obj instanceof Object);// true
    14. console.log(car1 instanceof CreateCar);//true instance可以判断实例是否

    通过对象的constructor属性判断是否和构造函数相等

    obj.constructor === Object

    8.原型模式

    构造函数通过prototype访问原型

    实例通过__proto__访问原型

    为什么obj.constructor === fn(构造函数)?因为原型上包括constructor属性,这个属性本质指向构造函数

    1. function CreateCarA(color, style) {
    2. this.color = color;
    3. this.style = style;
    4. }
    5. function CreateCarB(circle, num) {
    6. this.circle = circle;
    7. this.num = num;
    8. }
    9. CreateCarA.prototype.config = "顶配";
    10. CreateCarB.prototype = CreateCarA.prototype;
    11. var car1 = new CreateCarA("red", "car1");
    12. var car2 = new CreateCarB(true, 3);
    13. console.log(car1,car2);

     

    9.原型

    原型,实例,构造函数的关系:

    • 构造函数通过new 的形式创建实例对象;
    • 实例对象通过__proto__指向原型对象;
    • __proto__在实例的原型对象上
    • 构造函数通过prototype得到原型对象;
    • 原型对象上有constructor方法,原型对象通过constructor得到构造函数(原型对象的constructor指向构造函数);

    1. function Fn(name, age) {
    2. this.name = name;
    3. this.age = age;
    4. }
    5. // 通过 new Fn()指向实例
    6. var fn = new Fn("lmf", 22);
    7. console.log(fn);
    8. // 实例通过__proto指向原型对象,构造函数通过Fn.prototype指向原型对象
    9. console.log(fn.__proto__ === Fn.prototype);//true
    10. // 原型通过f1.constructor方式指向构造函数
    11. var f1 = Fn.prototype;
    12. console.log(f1.constructor === Fn);
    13. // Fn.address的形式是给构造函数添加静态属性,这种通过new Fn()是不能将其设置到实例对象上的
    14. Fn.address = "深圳";
    15. var fn2 = new Fn("lmf", 23);
    16. console.log(fn2);

     

     10.原型链

    1. 构造函数的prototype指向原型,原型通过constructor方法访问到构造函数;
    2. 构造函数通过new关键字创建实例;实例通过constructor可以访问到构造函数;
    3. 实例通过__proto__访问到原型
    4. 原型链决定了对象属性的访问方式
    1. var fn = new Fn("lmf", 22);
    2. var fn1 = Fn.prototype;
    3. console.log(fn.constructor === Fn.prototype.constructor);

  • 相关阅读:
    C. Fishingprince Plays With Array--Codeforces Global Round 21
    STM32CUBEMX_DMA串口空闲中断接收+接收发送缓冲区
    浅析ChatGPT中涉及到的几种技术点
    【面试心得】WebBench 整理
    SpringBoot集成Apache RocketMQ详解
    冒泡排序和鸡尾酒排序和快速排序
    Linux下的截图工具 —— Spectable
    Zookeeper篇---第十二篇
    教你几个MATLAB中数组索引的方法技巧
    SpringMVC入门(工作原理、框架流程、小实例的创建)
  • 原文地址:https://blog.csdn.net/qq_34569497/article/details/133828615