5.javascript原型链和继承详解(代码片段)

且听风呤dzq 且听风呤dzq     2023-01-03     618

关键词:

JavaScript原型链和继承详解

上一篇 JavaScript作用域和闭包详细总结

下一篇 JavaScript浅层克隆和深层克隆


一、原型

1.定义:原型是 function 对象的一个属性,它定义了构造函数制造出的对象的公共祖
先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
2.利用原型特点和概念,可以提取共有属性。
3.对象属性的增删和原型上属性增删改查。
4.对象如何查看原型 ==> 隐式属性 __ proto __
5.对象如何查看对象的构造函数 ==> constructor。

自己身上有属性,原型上也有属性,取近的,用自己的

二、原型链

1、构成原型链

Grand.prototype.lastName = "dzq";
function Grand();
var grand = new Grand();//grand对象继承了祖先的的lastName属性
console.log(grand.lastName);

Father.prototype = grand;//将对象grand赋给Father的原型
function Father()
    this.name = "lyh";
;
var father = new Father();//father就可以拿到lastName属性和它自己的name属性
console.log(father.lastName,father.name);

Son.prototype = father;//同理将对象father赋给Son的原型
function Son()
     this.hehe = "txc";
;
var son = new Son();//son就能拿到lastName、name属性,和自己的hehe属性
console.log(son.lastName,son.name,son.hehe)

2、原型链上属性的增删改查
原型链上的增删改查和原型基本上是一致的。只有本人有的权限,子孙是没有的。

3、谁调用的方法内部 this 就是谁

4、绝大多数对象的最终都会继承自Object.prototype

5、Object.create(原型);
Object.create 也能创建对象。var obj = Object.create(这里必须要有原型)

6、原型方法上的重写
原型上有这个方法,我自己又写了一个和原型上同一名字,但不同功能的方法,叫
做重写(同一名字的函数,不同重写方式)
通过返回值,形参列表不同传参
同样的名实现不同功能的,就是重写

原型链图解

了解this与call/apply方法

this
1.函数预编译过程 this —>指向 window
2.全局作用域里 this —> 指向 window
3.obj.func(); func()里面的 this 指向 obj(谁调用这个函数this就指向谁)
4.call/apply 可以改变函数运行时 this 指向,它们两的区别,是后面传的参数形式不同。

call
直接执行 Person.call ( )和 Person ( )没有区别
Person.call( );括号里面可以传东西
如果 Person.call( obj );里面的 call 让 person 所有的 this 都变成 obj
不 new 的话,this 默认指向 window。call 的使用必须要 new
call 的第一位参数用于改变 this 指向,第二位实参(对应第一个形参)及以后的参数都当做正常的实参,传到形参里面去

function Person(name,age,sex)
	this.name=name;
	this,age=age;
	this.sex=sex;

function Student(name,age,sex,tel,grade)
	this.name=name;
	this.age=age;
	this.sex=sex;
	this.tel=tel;
	this.grade=grade;

var student =new Student("sunny","123","male",123,2000)
/*call 改变 this 指向,借用别人的函数,实现自己的功能。
只能在你的需求完全涵盖别人的时候才能使用
如果不想要 age 这个,就不能使用这种方法*/
function Person(name,age,sex)
	this.name=name;
	this,age=age;
	this.sex=sex;

function Student(name,age,sex,tel,grade)
	Person.call(this,name,age,sex)
	this.tel=tel;
	this.grade=grade;

/*Person.call(this, name, age, sex);里面的 this 现在是 new 了以后的 var this=
利用 Person 方法,实现了 Student 自己的封装*/

apply
apply 也是改变 this 指向的,只是传参列表不同,第一位也是改变 this 指向的人,第
二位,apply 只能传一个实参,而且必须传数组 argunments
call 需要把实参按照形参的个数传进去

三、继承

继承发展史
1.传统形式 ==> 原型链
问题:过多的继承了没用的属性

2.借用构造函数 ==>利用 call、apply 所以不算标准的继承模式
1)不能继承借用构造函数的原型
2)每次构造函数都要多走一个函数 ==>浪费效率

3.共享原型(较好的继承方法)
不能随便改动自己的原型

Father.prototype.lastName = 'dzq';
function Father();
function Son();
Son.prototype = Father.prototype;//原型对象指向一个房间
var son = new Son();

圣杯模式
圣杯模式是在方法三的共有原型,但是在共有原型的基础上有改变。
共享原型是:son.prototype=father.prototype
圣杯模式是:另外加个构造函数 function F()当做中间层,然后让 F 和 father 共
有一个原型 F.prototype=father.prototype,然后 son.prototype = new F();使用原
型链形成了继承关系,现在改 son.prototype 就不会影响 father.prototype

var inherit = (function ()
	var F = function();//定义一个中间构造函数,私有化变量
	return function (target,origin)//target接受继承者,origin继承的目标
		F.prototype = origin.prototype;//将继承的目标原型对象赋给F.prototype
		target.prototype = new F();
		//new一个实例对象赋给接受继承的target
		//new后,Target.prototype指向的一个全新的地方
		//改变Target的原型链就不会影响到Origin
		target.prototype.constuctor = target;//将constructor指向自己
		target.prototype.uber = origin.prototype;//保存自己真正继承的目标,以便后期访问
	
());

原型链和继承(代码片段)

1.构造函数与实例对象首先我做了如下测试varA=function(a)this.a=a;varb=‘b‘;varfn=function()alert(a);this.fn1=fn;;vara=newA(‘a‘);得到的结果是:a.a=“a”a.b.undefineda.fnundefineda.fn1ƒ() alert(‘b‘);  查看详情

原型继承关系图详解(代码片段)

原型继承关系图详解代码+注释解析原型继承关系图分析经典原型关系图代码+注释解析/***一个例子说明原型继承的关系*/functionPerson(name,age,height)this.name=name;this.age=age;this.height=height;/***原型上挂载方法*/Person.prototype.... 查看详情

js原型链继承的傻瓜式详解(代码片段)

...对原型继承还没有大致了解,完全一头雾水,请先阅读《JavaScript高级程序设计》第六章最后部分的寄生组合式继承或者_廖雪峰js教程里面面向对象部分的原型承部分https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000... 查看详情

js中的继承详解(代码片段)

在js中实现的继承的方法可以有多种,除了原型继承之后,还可以使用借用、伪造构造函数的方法实现继承等等。接下来我们就详细的介绍一下这几种方式。1.js中的原型继承关于原型继承的内容其实在上一篇博客中已经... 查看详情

对javascript的原型,原型链和继承的个人理解

继承是OO语言中一个最为人津津乐道的概念,也是初接触Javascript的初学者难理解的概念=。=继承主要分为两种:一种是接口继承,另一种是实现继承。而在ECMAScript中只支持实现继承,所以我们今天来讨论讨论实现继承。实现继承... 查看详情

原型原型链和对象是怎么实现继承的

什么是原型?  声明函数时js会自动在你声明的函数对象(js一切皆对象)上挂载一些方法和属性 其中prototype属性就是  原型(也称为原型对象)如下图:这个原型对象里面保存着constructor自己的函数体(也就是Pro.prot... 查看详情

javascript中的原型链和继承

理解原型链在JavaScript的世界中,函数是一等公民。上面这句话在很多地方都看到过。用我自己的话来理解就是:函数既当爹又当妈。“当爹”是因为我们用函数去处理各种“粗活累活”(各种工具函数、页面交互、业务逻辑等... 查看详情

用ecmascript4(actionscript3)实现unity的热更新--使用原型链和eventtrigger(代码片段)

原型链是JS的必备,作为ECMAScript4,原型链也是支持的。特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用。本文旨在介绍如何使用原型链。任意对象类型都有一个prototype属性,包括导... 查看详情

es6基础2--构造函数和原型(代码片段)

构造函数和原型1.构造函数和原型1.1对象的三种创建方式1.2静态成员和实例成员1.2.2静态成员1.3构造函数的问题1.4构造函数原型prototype1.5对象原型1.6constructor构造函数1.7原型链1.8构造函数实例和原型对象三角关系1.9原型链和成员的... 查看详情

详解javascript的继承实现

我最早掌握的在js中实现继承的方法是在w3school学到的混合原型链和对象冒充的方法,在工作中,只要用到继承的时候,我都是用这个方法实现。它的实现简单,思路清晰:用对象冒充继承父类构造函数的属性,用原型链继承父... 查看详情

javascript面试题总结系列(代码片段)

5.JavaScript继承继承是什么A对象通过继承B对象,就能直接拥有B对象的所有属性和方法。方式一、原型链继承核心:子类型的原型为父类型的一个实例对象//创建一个父类(注意其本质仍然是一个构造函数)functionParent()this.name='kevi... 查看详情

js原型链和继承的理解

...向Object并且会切断之前原型对象的联系,破坏原型链。3.JavaScript主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的例子:xxx实例.p 查看详情

原型链和作用域链(代码片段)

一、原型链:1.原型对象:每一个构造函数都有一个prototype属性,这个属性就叫原型对象。每一个构造函数new出来的对象都有一个--proto--属性,这个属性指向原型对象。 <script>functionCar()//实例属性://this.produce=‘chevrolet... 查看详情

js继承之组合继承

...造函数的缺陷,融合了他们的优点,So,组合继承成为了JavaScript中最常用的继承模式。 查看详情

js基础类(代码片段)

...保护详解继承属性继承继承原理方法继承super表示从当前原型中执行方法constructor父类方法方法覆盖静态继承对象检测instanceofisPrototypeOf继承内置类,使用原型扩展内置类mixin实例操作基础知识为了和其 查看详情

javascript原型链污染学习记录(代码片段)

NodeJS原型机制,比较官方的定义:我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。1.JS原型和继承机制0>原型及... 查看详情

深拷贝和原型原型链和webapi和this指向等(中初级前端面事题)持续更新中,建议收藏(代码片段)

深拷贝值类型的赋值就是深拷贝:变量赋值时,拷贝的不是内存地址,而是将数据完整的在内存中复制了一份consta=10constb=aconsole.log(b);浅拷贝引用类型(null对象数组)的赋值操作都不是深拷贝:拷贝的是内存地... 查看详情

javascript原型继承。(代码片段)

查看详情