博客
关于我
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/

    你可能感兴趣的文章
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>
    CoreCLR源码探索(八) JIT的工作原理(详解篇)
    查看>>
    andriod 开发错误记录
    查看>>
    C语言编译错误列表
    查看>>
    看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
    查看>>
    CentOS5 Linux编译PHP 报 mysql configure failed 错误解决办法
    查看>>
    pycharm新建文件夹时新建python package和新建directory有什么区别?
    查看>>
    python中列表 元组 字典 集合的区别
    查看>>
    Android DEX加固方案与原理
    查看>>
    iOS_Runtime3_动态添加方法
    查看>>
    Leetcode第557题---翻转字符串中的单词
    查看>>
    Problem G. The Stones Game【取石子博弈 & 思维】
    查看>>
    Java多线程
    查看>>
    openssl服务器证书操作
    查看>>
    我用wxPython搭建GUI量化系统之最小架构的运行
    查看>>
    我用wxPython搭建GUI量化系统之多只股票走势对比界面
    查看>>
    selenium+python之切换窗口
    查看>>
    重载和重写的区别:
    查看>>
    搭建Vue项目步骤
    查看>>