博客
关于我
JS高级面向对象(二)-构造函数和原型
阅读量:654 次
发布时间:2019-03-15

本文共 2284 字,大约阅读时间需要 7 分钟。

JavaScript中的构造函数和原型之道

1. 创建对象的三种方式

在JavaScript中,对象可以通过三种方式创建:

  • 对象字面量:直接在代码中定义对象的结构。例如:

    var obj = {    name: '张三',    age: 20};

    这种方式高效,适合少量对象的创建。

  • 使用new Object()创建:这种方法创建一个空对象,然后手动添加属性。例如:

    var obj = new Object();obj.name = '张三';obj.age = 20;
  • 自定义构造函数:通过函数返回一个新的对象实例。例如:

    function People(name, age) {    this.name = name;    this.age = age;    this.sing = function() {        console.log('唱歌了!');    };}var person = new People('张三', 20);
  • 2. 静态成员和实例成员

    JavaScript允许在函数中通过this添加实例成员,而静态成员则是函数本身或原型上的属性。例如:

    • 实例成员
      function People(name, age) {    this.name = name;    this.age = age;}var a = new People('张三', 20);console.log(a.name); // 输出"张三"
    • 静态成员
      function People(name, age) {    this.name = name;    this.age = age;}People.maxAge = 30; // 静态成员console.log(People.maxAge); // 输出30

    3. 构造函数原型: prototype

    每个构造函数都有一个prototype属性,用于定义公共的方法和属性。这些方法会被所有实例共享。例如:

    • 在构造函数中定义方法:

      function People(name, age) {    this.name = name;    this.age = age;    this.sing = function() {        console.log(this.name + '唱歌了!');    };}
    • 通过原型共享方法:

      var a = new People('张三', 20);var b = new People('李四', 30);console.log(a.sing === b.sing); // true,两个实例共享同一方法
    • 原型对象的作用是避免重复存储方法,提高内存效率。

    4. 实例原型:proto

    每个实例都有__proto__属性,指向它的构造函数的原型。例如:

    var a = new People('张三', 20);console.log(a.__proto__ === People.prototype); // true

    当访问实例属性时,JavaScript会从__proto__中继而查找原型对象的属性。

    5. 构造函数的constructor属性

    构造函数的prototype属性也包含一个constructor,指回构造函数本身。这允许原型对象通过constructor重新指向正确的构造函数。

    6. 方法查找顺序

    JavaScript在查找对象属性时,会首先检查构造函数,然后检查原型对象,最后是更高层的原型。例如:

    Object.prototype.sex = '对象性别';People.prototype.sex = '实例性别';var a = new People('张三', 20);console.log(a.sex); // 输出"实例性别"

    7. 原型对象中的this指向

    原型对象中的方法在被调用时,其this会指向当前的对象实例。例如:

    function People(name, age) {    this.name = name;    this.age = age;    console.log('构造函数中的this:', this);}People.prototype.say = function() {    console.log('原型对象中的this:', this);}var a = new People('张三', 20);a.say(); // this指向对象a

    8. 构造函数与内置对象的扩展

    可以通过原型对象扩展内置对象的功能。例如,给Array添加求和方法:

    Array.prototype.sum = function() {    var total = 0;    for (var i = 0; i < this.length; i++) {        total += this[i];    }    return total;}var arr = new Array(10, 20, 30);console.log(arr.sum()); // 输出60

    9. 注意事项

    • 确保构造函数正确分配属性,避免在实例中重复定义方法。
    • 理解原型对象如何提高代码的可维护性和内存效率。
    • 在需要扩展内置对象时,谨慎地添加方法,以避免影响其他库或框架。

    通过理解和实践这些概念,JavaScript开发者能够更高效地构建和维护对象类型,充分利用原型机制优化代码性能。

    转载地址:http://srhmz.baihongyu.com/

    你可能感兴趣的文章
    Form窗体属性
    查看>>
    vue 错误收集
    查看>>
    Java选择排序算法实现
    查看>>
    00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
    查看>>
    00013.05 字符串比较
    查看>>
    IEDA全局搜索快捷键 Ctrl+shift+F无效的原因、 eclipse:Ctrl + h 进行全局搜索
    查看>>
    Effective Java 读书笔记
    查看>>
    SpringBoot使用@Email报错误
    查看>>
    Rabbitmq的内存磁盘监控
    查看>>
    访问servlet时弹出文件下载框解决方法
    查看>>
    IDEA-@Slf4j和log标签&@Data(Lombok)无效
    查看>>
    SpringCloud-Eureka报错 Error creating bean with name解决
    查看>>
    Thymeleaf 生成下标,索引,使用Stat变量
    查看>>
    ValueError: Unexpected end of file.
    查看>>
    六、登录(二)
    查看>>
    初始微服务---Springcloud发展【第一期】
    查看>>
    RAFT 拜占庭将军 共识算法
    查看>>
    UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
    查看>>
    cmd编译.java文件 : java:720: 错误: 编码GBK的不可映射字符 Why ? ? ? ?
    查看>>
    【Jquery】获取当前窗口的宽度值/高度值
    查看>>