前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链,由浅入深详细讲解!并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家,欢迎收藏+关注哦 💕

🌈🌈文章目录
一、
举个栗子:蛋炒饭

2.面向对象
面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。
<body> <script> // 继续抽取 公共的部分放到原型上 // const Person1 = { // eyes: 2, // head: 1 // } // const Person2 = { // eyes: 2, // head: 1 // } // 构造函数 new 出来的对象 结构一样,但是对象不一样 function Person() { this.eyes = 2 this.head = 1 } // console.log(new Person) // 女人 构造函数 继承 想要 继承 Person function Woman() { } // Woman 通过原型来继承 Person // 父构造函数(父类) 子构造函数(子类) // 子类的原型 = new 父类 Woman.prototype = new Person() // {eyes: 2, head: 1} // 指回原来的构造函数 Woman.prototype.constructor = Woman // 给女人添加一个方法 生孩子 Woman.prototype.baby = function () { console.log('宝贝') } const red = new Woman() console.log(red) // console.log(Woman.prototype) // 男人 构造函数 继承 想要 继承 Person function Man() { } // 通过 原型继承 Person Man.prototype = new Person() Man.prototype.constructor = Man const pink = new Man() console.log(pink) </script> </body>
5.原型链
基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链状的结构,我们将原型对象的链状结构关系称为原型链
<body> <script> // function Objetc() {} console.log(Object.prototype) console.log(Object.prototype.__proto__) function Person() { } const ldh = new Person() // console.log(ldh.__proto__ === Person.prototype) // console.log(Person.prototype.__proto__ === Object.prototype) console.log(ldh instanceof Person) console.log(ldh instanceof Object) console.log(ldh instanceof Array) console.log([1, 2, 3] instanceof Array) console.log(Array instanceof Object) </script> </body>
① 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
同样的将变量和函数组合到了一起并能通过this实现数据的共享,所不同的是借助构造函数创建出来的实例对象之
间是彼此不影响的。
构造函数和原型对象中的this都指向 实例化的对象
<script> function Person() { } // 每个函数都有 prototype 属性 console.log(Person.prototype) </script>
了解了 JavaScript 中构造函数与原型对象的关系后,再来看原型对象具体的作用,如下代码所示:
<script> function Person() { // 此处未定义任何方法 } // 为构造函数的原型对象添加方法 Person.prototype.sayHi = function () { console.log('Hi~'); } // 实例化 let p1 = new Person(); p1.sayHi(); // 输出结果为 Hi~ </script>
构造函数 Person
中未定义任何方法,这时实例对象调用了原型对象中的方法 sayHi
,接下来改动一下代码:
<script> function Person() { // 此处定义同名方法 sayHi this.sayHi = function () { console.log('嗨!'); } } // 为构造函数的原型对象添加方法 Person.prototype.sayHi = function () { console.log('Hi~'); } let p1 = new Person(); p1.sayHi(); // 输出结果为 嗨! </script>
构造函数 Person
中定义与原型对象中相同名称的方法,这时实例对象调用则是构造函中的方法 sayHi
。互不影响
三、凤生凤、<script> function Person() { // 此处定义同名方法 sayHi this.sayHi = function () { console.log('嗨!' + this.name) } } // 为构造函数的原型对象添加方法 Person.prototype.sayHi = function () { console.log('Hi~' + this.name) } // 在构造函数的原型对象上添加属性 Person.prototype.name = '小明' let p1 = new Person() p1.sayHi(); // 输出结果为 嗨! let p2 = new Person() p2.sayHi() </script>
总结:结合构造函数原型的特征,实际开发中往往会将封装的功能函数添加到原型对象中。
1.面向过程
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。
面向对象的特性:
二、原型对象与原型链
1.原型对象
构造函数通过原型分配的函数是所有对象所共享的。