首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS原型继承和类式继承

类式继承(构造函数) JS其实是没有类的概念的,所谓的类也是模拟出来的。特别是当我们是用new 关键字的时候,就使得“类”的概念就越像其他语言中的类了。...它有别于类继承是因为继承不在对象本身,而在对象的原型上(prototype)。每一个对象都有原型,在浏览器它体现在一个隐藏的__proto__属性上。在一些现代浏览器你可以更改它们。...原型最后指向的是null。我们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数不拥有这些方法和属性。...对比 和原型对比起来,构造函数(类)式继承有什么不一样呢?首先,构造函数继承的方法都会存在父对象之中,每一次实例,都回将funciton保存在内存,这样的做法毫无以为会带来性能上的问题。...从这里,我们也可以看到类继承原型基础的一些区别。 结论 原型继承比较符合js这种语言的特点。因为它本身就是js强大的原型的一部分。

3.4K90

JS的面向对象、原型原型链、继承总结大全

补充: js说一切都是对象,是不完全的,在js6种数据类型(Undefined,Null,Number,Boolean,String,Object),前五种是基本数据类型,是原始值类型,这些值是在底层实现的...showName 这种构造函数模式和原型模式组合使用,基本上可以说是js面向对象开发的一种默认模式,介绍了以上这几种常用创建对象的方式, 还有其他不常用的模式就不介绍了,接下来想说的是js中比较重要的继承...属性查找机制 js实例属性的查找,是按照原型链进行查找,先找实例本身有没有这个属性,如果没有就去查找查找实例的原型对象,也就是[[prototype]]属性指向的原型对象,一直查到Object.prototype...__proto__ === Object.prototype); // true 构造函数模式和原型模式组合继承 只通过原型来实现继承,还存在一定问题,所以js中一般通过借用构造函数和原型组合的方式来实现继承...方法继承,就是上文讲的到的原型链机制继承,另外可以给子构造函数添加自己的属性和方法。 这就是经典继承,避免了但是使用构造函数或者单独使用原型链的缺陷,成为js中最常用的继承方式。

1.4K22
您找到你想要的搜索结果了吗?
是的
没有找到

js继承原型

对于使用基于类的语言,如 Java 的开发人员,js 令人困惑,因为它是动态的,并且本身不提供一个 class 实现。...(在 ES2015/ES6 引入了 class 关键字,但那只是语法糖,JavaScript 仍是基于原型)。 谈到继承时,js 只有一种结构:对象。...该原型对象也有一个自己的原型对象( proto ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型的最后一个环节。...几乎所有 js 的对象都是位于原型链顶端的 Object 的实例。 尽管这种原型继承通常被认为是 JavaScript 的弱点之一,但是原型继承模型本身实际上比经典模型更强大。...例如,在原型模型的基础上构建经典模型相当简单。

1.4K10

原型原型链和原型继承

原型继承 编程对象继承,有类继承原型继承: 类继承形式上就是,extends 关键字,继承之后,子类就会拥有父类的属性和方法,如下: // 以下是 ES6 class 语法,语法上同类继承一样,但实际上仍然是原型继承...super(x, y) this.z = z; } } const dog1 = new Dog(1, 2, 3); dog1.run(); console.log(dog1.x); 复制代码 原型继承则是另外一种形式...上一小节是从继承的层面,介绍原型继承,但是没有具体说什么是原型。...那么上面继承过程,prototype 是什么, 它有什么用呢?...而javascript 运行环境是预设了一些对象来作为原型的,如图: 查找属性或方法时,向上追溯,经过的原型,就形成了一条链,所谓原型链。 至于运行环境预设了哪些原型,已经他们的关系如何,为什么?

75310

“工厂、构造、原型” 设计模式与 JS 继承

这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情 序言 我们在前一篇文章《JS精粹,原型继承和构造函数继承的 “毛病”》 ,提到了:原型继承、构造函数继承、组合继承; 在另一篇文章...《蓦然回首,“工厂、构造、原型”设计模式,正在灯火阑珊处》,提到了:我们用于创建对象的三种设计模式:工厂设计模式、构造设计模式、原型设计模式; 至此,我们可以明显的感受到:JS 要实现面向对象(继承的能力...这样做,会有效率问题,父类构造函数始终会被调用两次:一次是在子类构造函数调用,另一次在是创建子类原型时调用。...使用寄生式继承继承父 类原型,然后将返回的新对象赋值给子类原型。...的继承,一定离不开:工厂、构造、原型设计模式; 原型链 + 构造函数 = 组合继承 工厂+构造函数 = 寄生继承; 组合继承和寄生继承是最常用的两种继承方式。

1K30

js的this、call、apply、bind、继承原型

本文来自我的github 0.前言 这些都是js基础进阶的必备了,有时候可能一下子想不起来是什么,时不时就回头看看基础,增强硬实力。...首先,js没有严格意义上的子类父类,实现继承是依靠原型链来实现类似于所谓的类的效果。...3.2 prototype继承 要想子类获得父类的属性,如果是通过原型来实现继承,那么就是父类的一个实例是子类的原型: function F(){ this.a = [1,2,3,4] this.b...但是实例化都会调用两次构造函数,new和call 3.3Object.create继承原型继承) 这样子,可以在两个prototype中间加上一个中介F类,使得子类不会污染父类,子类A是父类B继承而来...__proto__原型对象被重写,他的构造函数是B,而不是中间量F,对于这种中间类F无意义,而且只是依靠中间原型对象,我们可以用比较完美的寄生组合式继承: function A() {} function

94810

JS精粹】原型继承和构造函数继承的 “毛病”

它的主要问题出现在:原型包含引用值的时候,原型包含的引用值会在所有实例间共享。...其实,我们也知道,很少在业务代码这样去写继承:SubType.prototype = new SuperType() ,原型继承会造成复用的混乱,所以它基本不会被单独使用。...,但是它也有它的问题,也是使用构造函数模式自定义类型的问题, 即:必须在构造函数定义方法(在原型上定义方法,子类是访问不到的),函数不能重用。...} let s1 = new SubType() let s2 = new SubType() console.log(s1.fn === s2.fn) // false 而这一点,在原型继承...说实话,JS 继承真的很奇怪。。。并不是面向对象语言,又要通过原型链去模拟面向对象,真的很多小坑的点需要去注意。

1.2K20

JS原型原型

原型 JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象。prototype对象属性的所有属性和方法都会被构造函数的实例继承。...prototype就是调用构造函数所创建的实例对象的原型(proto)。js在创建对象的时候,都有一个叫做proto的属性,用于指向它的函数对象的原型对象prototype。...原型链 每一个对象都可以有一个原型,这可原型还可以有它自己的原型,以此类推,就形成了原型链。...查找一个对象的属性或方法的时候,如果这个对象没有这个属性或者方法,那就会在这个对象的原型对象中去找,以此类推,直到原型链结束。..._proto_ _proto_是原型链查询实际用到的,指向构造函数的原型对象,他是对象独有的。对象._proto_ = 构造函数.prototype。 在js,万物皆是对象,函数也是对象。

1.5K10

js原型原型

​一、原型 1、prototype和constructor 在js每个函数(非箭头函数,一般关于原型的有关知识我们都只考虑构造函数)都会拥有一个 prototype 属性,该属性值是一个对象...p 继承了 Person 原型对象上的方法和属性、如果在创建一个 实例对象同样可以继承该构造函数原型上的属性和方法,实现了数据共享。...__proto__) // true 二、原型原型链:《JavaScript高级程序设计》的描述是:每个构造函数都有一个原型对象,如果该原型是另一个类型的实例呢?...原型的查找机制:实例对象上找不到指定属性,就从该原型对象上找,如果还是找不到就到该原型对象上的原型上去找,。...语句上,它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象修改它的 [[Prototype]]。

1.1K00

JS原型链与继承别再被问倒了

原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承继承方法签名,而实现继承继承实际的方法....由于js中方法没有签名,在ECMAScript无法实现接口继承.ECMAScript只支持实现继承,而且其 实现继承 主要是依靠原型链来实现的....原型继承 该方法最初由道格拉斯·克罗克福德于2006年在一篇题为 《Prototypal Inheritance in JavaScript》(JavaScript原型继承) 的文章中提出....提醒: 原型继承, 包含引用类型值的属性始终都会共享相应的值, 就像使用原型模式一样. 寄生式继承 寄生式继承是与原型继承紧密相关的一种思路, 同样是克罗克福德推而广之....new运算符 此处引用 艾伦的 JS 对象机制深剖——new 运算符 接着上述对new运算符的研究, 我们来考察 ECMAScript 语言规范 new 运算符的定义: The new Operator

61150

构造函数、原型原型链、继承

JS里一切皆对象,对象是“无序属性的集合,其属性值可以是数据或函数”。...__proto__.constructor === man.constructor; //true 构造-原型组合模式 根据对象的特性,对象上没有的属性会在原型对象寻找,所以可以把公共的属性和方法给到原型对象上去...如果在实例对象A上访问某个属性或方法,JS会从实例对象A开始沿着原型链层层查找,直到遇见null。...继承 有了原型链的概念就可以开始实现继承了,最基本的模式就是修改原型对象: function Father(){ this.say = function(){return this.name} }...总之利用原型链实现可靠继承的步骤是: 在父类函数内设置通用的属性 在子类函数内调用父类函数,并设置特有的属性 修改子类函数的prototype,以继承父类 修改子类函数的prototype.constructor

75920

ES5的对象冒充继承原型继承

ES5里原型链的继承,既可以实现构造函数的继承又可以实现原型链的继承 function Person() { this.name = 'Augus'; this.age = 20;...'); }; function Web() { }; // 原型链实现继承 Web.prototype = new Person(); // 可以继承构造函数里面的属性和方法 // 也可以继承原型链上面的属性和方法...ES5原型继承存在的问题,实例化子类没法给父类传值 function Person(name, age) { this.name = name; this.age = age...原型链+构造函数的组合继承模式,可以实例化子类向父类传值 function Person(name, age) { this.name = name; this.age = age;...原型链+构造函数的组合继承模式的另一种写法 function Person(name, age) { this.name = name; this.age = age; this.say

46020

JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】下篇

Git专栏:Git篇 JavaScript专栏:js实用技巧篇,该专栏持续更新,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流 你的一键三连是对我的最大支持 ❤️...文章目录 ✔️前言 内容 继承 伪经典模式/圣杯模式 类语法 总结 ✔️前言 ❗️ ❗️ ❗️本篇系将带来JavaScript的构造——原型——原型链——继承——ES6类语法系列知识完整讲解。...❗️ ❗️ ❗️ ❕上篇涉及:构造——原型——原型链 ❕下篇涉及:继承——ES6类语法 内容 继承 初认识 此处我们就以通常在各种平台所见到的会员与非会员举例: 普通会员 属性:用户名、密码 方法:...学过后端语言的朋友一定很清楚这是个什么玩意儿 子类的实例应该自动拥有父类的所有成员 JavaScript继承具有两个特性: 单根性:子类最多只有一个父类 传递性:间接父类的成员会传递到子类...如何在JS中封装继承

69810

JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】上篇

Git专栏:Git篇 JavaScript专栏:js实用技巧篇,该专栏持续更新,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流 你的一键三连是对我的最大支持 ❤️...文章目录 ✔️前言 内容 构造函数 原型 原型链 总结 ✔️前言 ❗️ ❗️ ❗️本篇系将带来JavaScript的构造——原型——原型链——继承——ES6类语法系列知识完整讲解。...❗️ ❗️ ❗️ ❕上篇涉及:构造——原型——原型链 ❕下篇涉及:继承——ES6类语法 内容 构造函数 何为构造函数?...由于JS中所有对象都是通过new产生的,因此,严格来说,JS中所有对象都称之为实例 //例: const obj = { a:'0', b:'1', c:'2' } //上面等价于var obj =...当访问实例成员时,先找自身;如果不存在,会自动从隐式原型寻找。

72320
领券