16-js面向对象
admin
2024-01-28 16:47:05
0

文章目录

    • 面向对象
      • 一、常见创建对象的方式
        • 1. 构造函数方式
        • 2. 字面量方式
        • 3. 工厂函数方式
        • 4. 自定义函数方式
      • 二、构造函数的使用注意点
        • 1. 与new关键字连用
        • 2. 首字母大写
        • 3. 传参写进()
        • 4. this指向实例对象
        • 5. 构造函数内部不要写return
        • 6. 构造函数内的方法
      • 三、原型 prototype
        • 1. 概念
        • 2. 使用方法
        • 3. 构造函数与实例对象

面向对象

面向对象是一种编程思想,相对于面向过程而言。

面向过程关注的是每一个元素,元素之间的关系、顺序…

面向对象关注是找到一个对象,直接完成效果。

一、常见创建对象的方式

1. 构造函数方式

调用系统内置的构造函数创建对象,new Object()

// 创建一个对象
const obj = new Object();
// 动态给对象添加键值对
obj.name = "lucy";
obj.age = 18;
obj.gender = '女';

2. 字面量方式

直接使用字面量,也就是{}

const obj2 = {name:'jack',age:12
}
obj2.gender = '男';

3. 工厂函数方式

写一个工厂函数(普通函数),创建一个对象,可以给对象添加一些属性,可return对象

// 工厂函数
function createObj(name,age,gender){// 手动创建对象const obj = new Object();// 手动添加属性obj.name = name;obj.age = age;obj.gender = gender;// 手动return 对象return obj;
}
// 使用工厂函数创建对象
const zhangsan = createObj('张三',12,'女');
const lisi = createObj('李四',13,'男');

4. 自定义函数方式

自动创建对象,手动添加属性,自动返回对象

// 把函数Human当构造函数调用(和new一起使用)
const h1 = new Human('lucy',12,'女');

只要有new连用,在函数的开头自动添加const this = new Object();.在函数结尾自动添加return this;.

构造函数里面的this是创建好的那个对象,也可以成为实例对象。

function Human(name,age,gender){// 自动创建对象,赋值给this// const this = new Object();//手动添加属性this.name = name;this.age = age;this.gender = gender;// 自动return this// return this;
}

二、构造函数的使用注意点

1. 与new关键字连用

const h1 = new Human('lucy',12,'女');

2. 首字母大写

首字母不大写,只要与new连用,就是构造函数,有创建对象的能力。

建议构造函数的首字母大写。

3. 传参写进()

调用时,如果不需要传参可以不写(),建议都写上

4. this指向实例对象

构造函数内部的this,由于与new连用,this指的是创建好的实例对象

5. 构造函数内部不要写return

因为构造函数内部会自动返回一个对象:

如果return 一个复杂数据类型(return [12,34,56];),则构造函数返回是复杂数据类型

如果return 一个基本数据类型(return 123;),则构造函数还是返回this的实例对象

6. 构造函数内的方法

构造函数内部可以赋值函数,写为构造函数里面的方法。

function Person(){this.name = 'jack';this.age = 18;this.sayHi = function(){console.log("构造函数constructor")}
}
const o1 = new Person();
const o2 = new Person();
// 调用构造函数里的方法
o1.sayHi();
o2.sayHi();
// 两个对象中的sayHi函数占用了两个不同的内存空间

复杂数据类型比较的是地址

需要一个东西,使得同一个构造函数new出来的对象,可以共用,就是原型 prototype

三、原型 prototype

1. 概念

每一个函数自身带有一个成员,prototype,是一个对象空间

function fn(){}
console.dir(fn)

构造函数中的原型

function Person(){} // Person = { prototype:{}}

给这个对象动态地添加一些东西

Person.prototype.sayHi = function(){console.log('hi')
}

重点:

在函数prototype中存储的内容,不是给函数使用的(函数也能用),是给函数的每一个实例对象使用的。也就是给构造函数new出来的对象使用的。

2. 使用方法

__proto__

每一个对象都自带一个成员,叫做__proto__,是一个对象空间

const obj = {name:'lucy'};
/*在浏览器中输出obj={name:'lucy',[[Prototype]]:{}}// [[Prototype]]的真实名字是__proto__,是浏览器自己使用的,不希望用户去使用
*/

当访问一个对象中的成员时,

  • 如果对象本身有这个成员,就会直接给结果,
  • 如果没有,就会去__proto__对象空间中找,如果有就会给结果(找不到返回undefined,参见下一文原型链)
function Person(){this.name='lucy';this.age = 12
}Person.prototype.sayHi = function(){console.log('hello world');
}const p1 = new Person();
console.log(p1);
/*P1 = {name:'lucy',age:12,__proto__=Person.prototype:{sayHi:function(){}}}
*/
const p2 = new Person();
console.log(p2);
console.log(p1.sayHi() == p2.sayHi())//true

此时,p1 p2 使用的都是原型中的函数,比较的内存空间地址一致

总结:

在书写构造函数时,

属性写在构造函数里面,如this.name = 'lucy'

方法写在原型对象里面,如Person.prototype.sayHi = function(){}

3. 构造函数与实例对象

  1. 数组

    const arr = new Array(1,2,3);
    const arr2 = ['hello'];
    // 数组中的所有方法,如map,forEach,filter...
    console.log(Array.prototype)Array.prototype.abc = function(){console.log(this);console.log("新添加的abc方法");
    }
    // 数组调用abc方法
    arr.abc()
    arr2.abc()
    // 原型上的方法里面的this是实例对象
    
  2. 函数

    const fn = function(){alert(1)};
    function fn2(){alert(2)};
    const fn3 = new Function('alert(3)');
    fn();
    fn2();
    fn3();
    // 所有的js函数都是Function构造new出来的
    //构造函数的prototype == 它的实例对象.__proto__
    console.log(fn.__proto__ == Function.prototype) //true
    console.log(Function.__proto__ == Function.prototype) // true
    

    js中的顶级构造函数是Object

相关内容

热门资讯

三大指数集体低开,航天系、AI... 1月19日,A股三大指数集体低开,上证指数下跌0.27%,深证成指跌0.41%,创业板指跌0.6%。...
绽妍生物拟北交所上市:70后副... 瑞财经 刘治颖 1月13日,绽妍生物科技股份有限公司(以下简称:绽妍生物)在四川证监局完成IPO辅导...
欧盟或以930亿欧元关税反制特... 据新华社,据英国《金融时报》18日报道,欧盟多国正考虑对价值930亿欧元的美国输欧商品加征关税,或者...
网友炸锅!拒绝年会表演,员工被... 掐指一算 还有一个月就要过年了 不少单位也把“年会”提上日程 屏幕前的你有登上过年会舞台吗? 但没想...
金银上涨!美股三大股指期货下跌... 1月19日亚太早盘,现货白银向上触及94美元/盎司,日内上涨3.62%;现货黄金向上触及4675美元...
商业航天的远期空间与短期估值 来源:滚动播报 2026年伊始,商业航天率先点燃市场热情。不过,在连日上涨后,商业航天板块出现回调。...
1月19日投资避雷针:2400... 导读:财联社1月19日投资避雷针,近日,A股及海外市场潜在风险事件如下。国内经济信息方面包括:1)小...
1800多万元利息暗藏多少猫腻... 新年伊始,广州农商银行总行营业部大厅迎来业务高峰,广东省广州市某碳纤维技术企业负责人乔文(化名)一大...
机构研究周报:重视业绩与性价比... 【摘要】华泰证券何康称,考虑到1月中下旬将进入业绩预告密集期,建议结合分析师预期与高频中观数据寻找高...
石家庄尚太科技股份有限公司 向... 本公司及董事会全体成员保证信息披露内容的真实、准确和完整,没有虚假记载、误导性陈述或重大遗漏。 特别...
原创 油... 今天是1月18号,离春节也就十来天了,本来想着油价还能再低点,趁过年回家前加一箱便宜油,结果这两天消...
特朗普对欧洲盟友加关税,欧洲随... 1月17日,在丹麦自治领地格陵兰岛首府努克,格陵兰岛自治政府总理延斯-弗雷德里克·尼尔森(中)与当地...
A股公司,密集发布! 年报披露大幕即将开启,又一批年报业绩预告出炉。 1月18日晚间,隆基绿能、锐明技术、爱旭股份、通威股...
精细化运营的母婴平台:如何提升... 概述 在母婴类数字平台中,妈妈网、宝宝树和亲宝宝是较为常见的应用。它们在定位、功能侧重和商业模式上存...
原创 1... 当全世界还沉浸在新年的余温里,79岁的特朗普却像个打了鸡血的斗士,精力旺盛得让人害怕。 他在委内瑞拉...
“科技年货”扎堆上新!华强北开... 新春将至 深圳华强北商业步行街 正掀起一场以 “科技年货”为主角的 消费热潮 记者近日采访获悉,围绕...
原创 中... 2026年1月15日,中国人工智能领域迎来里程碑时刻——由智谱与华为联合研发的多模态图像生成模型GL...
不学抖音学INS,OpenAI... 文 | 字母榜,作者 | 苗正,编辑 | 王靖 一年多以前,奥特曼对AI+广告这件事嗤之以鼻,他在...
真“车厘子自由”!价格近乎腰斩... 本文来源:消费者报道 作者:郑艺阳 “今年车厘子品质和价格达到了一个很好的平衡,不再是高端水果,而是...
阳光乳业大宗交易折价成交278... 阳光乳业01月16日大宗交易平台共发生13笔成交,合计成交量278.42万股,成交金额3872.81...