JavaScript进阶:js的一些学习笔记-原型

文章目录

        • js面向对象
          • [1. 原型](#1. 原型)
          • [2. constructor属性](#2. constructor属性)
          • [3. 对象原型](#3. 对象原型)
          • [4. 原型继承](#4. 原型继承)
          • [5. 原型链](#5. 原型链)
js面向对象

构造函数 属性和方法

js 复制代码
function Person(name,age){
	this.name = name;
    this.age = age;
    this.play = ()=>{
    	console.log('玩!');
    }
}
const a = new Person('1',12),b = new Person('2',13);
console.log(a.play == b.play);
// flase
1. 原型

作用在构造函数的属性

  • 构造函数通过原型分配的函数是所有对象所共享的
  • js规定,每一个构造函数都有一个prototype属性,指向另一个对象,称为原型对象
  • 这个对象可以挂载函数,对象实例化不会多次创建原型上的函数,节约内存
  • 把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
  • 构造函数和原型对象中的this都指向实例化对象
js 复制代码
function Person(name,age){
	this.name = name;
    this.age = age;
}
Person.prototype.play = ()=>{
    console.log('玩');
}
const a = new Person('1',12),b = new Person('2',13);
console.log(a.play == b.play);
// true

在Array上定义方法max用于求数组中的最大值

js 复制代码
Array.prototype.max = function(){
    let arr = this;
    let res = arr[0];
    for(let e of arr){
        if(e > res)
            res = e;
    }
    return res;
}

const arr1 = [1,2,3];
console.log(arr1.max());
// 3
2. constructor属性

每个原型对象里面都有constructor属性,该属性执行该原型对象的构造函数

使用场景:如果有多个对象的方法,我们给原型对象采取对象形式赋值,但是这样就会覆盖构造原型对象原来的内容,这样修改后的原型对象constructor就不再指向当前构造函数了,此时,我们可以在修改后的原型对象中,添加一个constructor指向原来的构造函数

js 复制代码
function Person(){}
/*Person.prototype = {
    // constructor:Person,
    play:function(){
        console.log('玩!');
    }
}
console.log(Person.prototype);
// {play: ƒ}
*/
Person.prototype = {
    constructor:Person,
    play:function(){
        console.log('玩!');
    }
}

console.log(Person.prototype);
// {constructor: ƒ, play: ƒ}
3. 对象原型

对象都会有一个属性**_proto _指向构造函数的prototype原型对象,之所以对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有 proto**原型的存在。

js 复制代码
function Person(){}
const a = new Person();
console.log(a.__proto__ == Person.prototype);
// true
js 复制代码
function Person(){}
const a = new Person();
a.__proto__.play = function(){
    console.log('哈哈');
}
const b = new Person();
b.play();
// 哈哈
4. 原型继承
js 复制代码
function Person(){
    this.eyes = 2
    this.head = 1
}

function Woman(){}
function Man(){}
Woman.prototype = new Person()
Woman.prototype.constructor = Woman;
Woman.prototype.play = function(){
    console.log('玩!');
}
Man.prototype = new Person();
Man.prototype.constructor = Man;

const a = new Woman(),b = new Man();
console.log(a,b);

运行结果:

5. 原型链
js 复制代码
function Person(){}
console.log(Person.prototype.__proto__ == Object.prototype)
// true

console.log(Object.prototype.__proto__);
// null

const a = new Person();
console.log(a.__proto__.__proto__ == Object.prototype)
// true
  • 当访问一个对象的属性(或方法)时,首先查找这个对象自身有没有该属性
  • 如果没有就查找它的原型(也就是**proto**指向的prototype原型对象)
  • 如果还没有就查找原型对象的原型(Object的原型对象)
  • 依次类推一直找到Object为止(null)
  • **proto**对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
  • 可以使用 instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
相关推荐
I'm Jie2 小时前
深入了解 Vue 3 组件间通信机制
前端·javascript·vue.js
用户90443816324603 小时前
90%前端都踩过的JS内存黑洞:从《你不知道的JavaScript》解锁底层逻辑与避坑指南
前端·javascript·面试
PPPPickup4 小时前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
老前端的功夫4 小时前
前端高可靠架构:医疗级Web应用的实时通信设计与实践
前端·javascript·vue.js·ubuntu·架构·前端框架
脾气有点小暴5 小时前
前端页面跳转的核心区别与实战指南
开发语言·前端·javascript
San30.6 小时前
深入 JavaScript 内存机制:从栈与堆到闭包的底层原理
开发语言·javascript·udp
Fantastic_sj7 小时前
Vue3相比Vue2的改进之处
前端·javascript·vue.js
ttod_qzstudio8 小时前
深入理解 TypeScript 数组的 find 与 filter 方法:精准查找的艺术
javascript·typescript·filter·find
冬男zdn8 小时前
优雅处理数组的几个实用方法
前端·javascript
克喵的水银蛇9 小时前
Flutter 通用标签选择组件:TagSelector 支持单选 / 多选
javascript·windows·flutter