面向对象之原型链

原型链的认识

  • 既然提到原型链,就需要和构造函数联系起来进行理解;

构造函数的认识

其实构造函数时函数调用的一种模式,例如创建了一个函数,然后通过一个变量new了这个函数,那么这个函数就可以成为构造函数,可以从作用上来理解它为什么叫构造函数,直白点可以说是来构造一个对象出来的,实际上是实例化了一个对象出来,任何通过new来进行操作的函数都可以成为构造函数。
    接下来那么这个被new出来的对象就会继承创建出来的那个函数的属性,前提是在构造函数内部通过this.属性名这样的属性new出来的实例对象才能拥有。

引出原型链的认识

当new出的这个实例对象需要访问某个属性时,首先它会在其本身查找,也可以理解为是先看其构造函数内部有没有通过this.属性名初始化这个属性,如果没有找到这个属性,也就是没有从本身找到这个属性,那么它就会往上查找,这个查找过程中查的那条链就叫做原型链,具体了解可以看引申出来属性搜索原则,下面有总结,其实这也和原型继承这个机制是联系在一起的,可以说设计这个原型链就是为原型继承服务的;

构造函数的整个过程:

  • 1、new申请内存,创建对象,(new运算符可以称作新建运算符);
  • 2、调用构造函数,构造函数有一个隐式参数,即this;
  • 3、刚创建出来的对象的引用赋值给this,由函数处理;(其实主要就是利用new能够动态改变this的指向)
  • 4、在构造函数中利用this.成员 = 值来给对象添加成员

构造函数的优势:

  • ①、对象就有独立的原型对象;
  • ②、也具有类型名了

属性搜索原则

  • ①、在当前对象中找;
  • ②、在构造函数定义规则中找;
  • ③、在其原型对象中找;
  • ④、在其原型对象的原型对象中找…….直到Object.prototype,这等于就是在其原型链上寻找
  • ⑤、如果没有则返回undefined;

稍微深入的理解下原型

其实对象中有一个属性 叫 proto
通过调试可以发现 对象的 proto 与创建(实例化)它的构造函数的 prototype 是一个东西
看下面的代码测试:

1 function F() { //声明一个构造函数
2
3 }
4 var o = new F(); //通过这个构造函数实例化一个对象o
5
6 console.log( o.__proto__ === F.prototype ); //true

注意一下 proto 是非标准属性,这里也只是辅助理解来运用下,实际工作中不要采用它来进行业务逻辑

原型对象与原型属性

F.prototype 是构造函数 F 的原型属性
F.prototype 是对象 o 的原型对象

proto与prototype有什么区别

_proto_是站在对象的角度讨论其原型对象
prototype是站在构造函数的角度讨论其原型属性,或构造函数创建的对象的原型对象
也可以理解成所站的位置不同,就会有不同的角色。

上面的这些理论知识还是会有些抽象,抽时间我会把原型链画一下,那样理解起来就清晰了。

时间: 2024-08-24 04:01:36

面向对象之原型链的相关文章

js面向对象编程/原型链/继承 —— javascript

目录 js面向对象编程 js原型链 共享方法 原型继承 js面向对象编程 js面向对象编程不同于 java 的类和对象 JavaScript 不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程. js声明的构造函数,类似于普通函数的声明,但又不同, 实例对象时,如果不写new,就是一个普通函数,它返回 undefined. 但是,如果写了new,它就变成了一个构造函数,它绑定的 this 指向新创建的对象, 并默认返回 this,也就是说,不需要在最后写return th

面向对象、原型链、继承知识梳理

单例模式:就是一个对象咯 var person={ name:'xuwen', age:17 }; var person2={ name:'xiaoxu', age:25 } 工厂模式:就是一个函数,解决批量生产问题 1 function fn(name,age){ 2 var obj={}; 3 obj.name=name, 4 obj.age=age, 5 obj.write=function(){ 6 console.log(obj.name); 7 } 8 return obj; 9 }

面向对象与原型链

类的声明和实例化 //.类的声明 var Animal = function () { this.name = 'Animal'; }; //es6中class的声明 class Animal2 { constructor () { this.name = 'Animal2'; } } //实例化 console.log(new Animal(), new Animal2()); 继承 代码的抽象和代码的复用 原型链继承 <script> function Parent(){ this.nam

js面向对象之原型链

对于c/c++/java,继承的方法直接用相应的语法继承,但是javaScript不一样,js是采用原型继承的思路来实现面向对象的. js-类 在js中并没有class的概念,使用了一个函数,运行new的时候会为函数生成一个对象,对象含有隐藏的属性_proto_,这个属性的值就是对fun.prototype的引用. 例如下面的person函数: function Person(name, gender) { this.name = name; this.gender = gender; } va

简单粗暴地理解js原型链--js面向对象编程

简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗

JavaScript 随笔2 面向对象 原型链 继承

第六章 面向对象的程序设计 1.创建对象的几种方式 A)工厂模式 function CreatObj(name,sex,age){ this.name=name; this.sex=sex; this.age=age; } 缺点:虽然可以批量创建对象,却不能知道对象的类型 只知道他是Object类型: B)构造函数 function Person(name,sex){ this.name=name; this.sex=sex; this.sayName=function(){ alert(thi

javascript面向对象系列5——知识点(原型和原型链)

基本概念 [原型链]每个构造函数都有一个对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,如果原型对象等于另一个原型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针.如果另一个原型又是另一个原型的实例,那么上述关系依然成立.如此层层递进,就构成了实例与原型的链条. [原型对象]这个对象包含可以由特定类型的所有实例共享的属性和方法.所有引用类型默认都继承了Object,而这个继承也是通过原型链实现

面向对象中的原型和原型链

今天我们要说的是面向对象中的原型链,在说原型链之前,我们先一步一步来了解一下面向对象中的一些基本概念. 一.类 类是指具有相同特征(属性)和行为(方法)的事物的集合. 二.对象 对象的目的实际上是将具有相同属性和行为的代码整合在一起,方便我们的管理. 起初,我们是这样来创建一个对象的, js代码: var person1 = { name:"张三", age:18, height:165, walk:function(){ console.log("i can walk!&q

JS面向对象(2)——原型链

原型链用于ECMAScript的继承.其思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.说人话,我们知道,一个构造函数Subtype,其原型对象有一个指向构造函数的指针,这是联系构造函数和原型的桥梁,如果我让原型对象的指针指向了另一个原型,而另一个原型原本指向其构造函数的指针也指向了另一个原型,那么,这就是一个原型链了,原型上的属性会一层一层往下传递. function SuperType(){ this.property=true; } SuperType.prototype.ge