第一行代码声明了一个名为 Person 的函数,第二行代码,根据上面的构造函数定义,那么函数 Person 可以称作一个构造函数
SuperType 和SubType。每个类型分别有一个属性和一个方法。它们的主要区别是:
在JS中,我们经常会遇到原型。字面上的意思会让我们认为,是某个对象的原型,可用来继承。但是其实这样的理解是片面的,下面通过本文来了解「原型与原型链」的细节,再顺便谈谈继承的几种方式。
JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到问题靠“猜”,却不理解它的规则!
网上有太多关于原型的资料,不是一上来就各种概念,让人看到摸不着头脑,就是贴各种代码,少个通俗的解释,所以才有了这一篇文章。
在JavaScript中,每个对象都有一个原型(prototype),它是一个对象,包含可共享的属性和方法。当你访问一个对象的属性或方法时,如果该对象自身没有该属性或方法,JavaScript就会查找该对象的原型,以查看是否存在该属性或方法。如果存在,它就会使用该属性或方法。如果原型的原型也不存在该属性或方法,JavaScript将继续查找原型链,直到找到该属性或方法或者到达原型链的末尾。
上面一段代码,声明第一个函数foo的时候,它就会带一个foo.prototype的属性,这个属性是一个对象属性,用new foo();构造器的方式构造一个新的对象obj。这时候这个obj的原型会指向foo的prototype属性。 对于这个foo函数的原型也会指向Object.prototype,这个Object.prototype也是有原型的,它的原型指向null。
在上面的例子中 o1 o2 o3 为普通对象, f1 f2 f3 为函数对象。 怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。 f1,f2,归根结底都是通过 new Function()的方式进行创建的。
1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,但是刚开始的Js没有继承机制,更别提像同时期兴盛的C++和Java这样拥有面向对象的概念。在实际的开发过程中,工程师们发现没有继承机制很难解决一些问题,必须有一种机制能将所有的对象关联起来。
普通的内置对象与基本包装类型的主要区别就是对象的生命期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只是存在于一行代码的执行瞬间,然后立即被立即销毁。这意味着我们不能再运行时为基本包装类型值添加属性和方法。
在javascript语言中,原型与原型链是一个非常重要的概念,因为它们是javascript语言得以成立的根本。因为javascript是基于原型的面向对象编程语言,这有别于基于类的java、python等面向对象编程语言。虽然javscript现在也有了class,但它骨子里还是个基于原型的语法糖罢了。所以在使用javascript时,始终要记清基于原型,基于原型,基于原型。
简介:继承是OO语言中的一个最为人津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。 但是JS的函数并没有签名,所以在ECMAScript中无法实现接口继承。ECMAScript只支持实现继承。而且其实现继承只要是靠原型链来实现的。 1、原型链: ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。 基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。 简单回顾下构造函数、原型和实例的关系:每个构造函数
与多数面向对象的开发语言有所不同,虽然JavaScript没有引入类似类的概念(ES6已经引入了class语法糖),但它仍然能够大量的使用对象,那么如何将所有对象联系起来就成了问题。于是就有了本文中我们要讲到的原型和原型链的概念。
由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现
面试题这种东西真的是反人类的设计,我觉得它的最大的作用就是用来打击我的信心。每当我觉得自己js水平还可以,的时候,它就会在不经意间跳出来,给我一耳光。例如这个, var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f = new F(); // f能得到a,b吗?啥原因? 当然了,这种东西也是网上瞎逛来的。最近在讲课,所以技术类的东西会多写一些。 回到这个题,我一
原型链是javascript非常重要的基础知识。最近在阅读node.js,发现许多代码乍一看会觉得很费解,但细细品味之后会觉得非常优雅,对于代码细节的把控和性能的考量让人觉得赞叹。不得不说看大师级的作品真的是一种享受。本篇中我将以cluster模块中子进程管理对象Worker类的实现为例,带你一起看看堪称艺术的代码是如何像手术一样操作原型链,同时理解本节的知识点对于下一篇cluster模块的学习压力。
学习js的过程中我们绕不开两链一包的学习,尤其是在面试中,关于作用域链,前些时间分析过了,有兴趣的话可以关注一下关于JS中的作用域中的沉思,这篇文章主要是关注原型链性质特点
上篇文章详细解析了原型、原型链的相关知识点,这篇文章讲的是和原型链有密切关联的继承,它是前端基础中很重要的一个知识点,它对于代码复用来说非常有用,本篇将详细解析JS中的各种继承方式和优缺点进行,希望看完本篇文章能够对继承以及相关概念理解的更为透彻。
前言 当今 JavaScript 大行其道,各种应用对其依赖日深。web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解。所以,经常出现的情况是,很多做了多年 JS 开发的程序员对闭包、函数式编程、原型总是说不清道不明,即使使用了框架,其代码组织也非常糟糕。这都是对原生 JavaScript 语言特性理解不够的表现。要掌握好 JavaScript,首先一点是必须摒弃一些其他高级语言如 Java、C# 等类式面向对象思
这一章相对来说是部重头戏,看完之后才发现用了这么久的js,却很少有用真正OO的思想在写js代码……
查看发现是一个叫“原型链污染”(Prototype chain pollution)的漏洞,还好这只是 dev 依赖,当前功能下几乎没什么影响,其修复方式可以通过升级包版本即可。
原型和原型链在面试中历来备受重视,经常被提及。说难可能也不太难,但要真正完全理解,吃透它,还是要多下功夫的。
javascript中的继承机制是建立在原型的基础上的,所以必须先对原型有深刻的理解,笔者在之前已经写过关于js原型的文章。
面向对象:面向对象、原型 对原型、原型链、 Function、Object 的理解 什么是 JS 原型链? 转载以上文章
也可以看看这篇文章周大侠啊 进击的 JavaScript(六) 之 this先了解一下`this的四种绑定规则和箭头函数的this绑定
1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例。但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propotype chains)实现的。但在ES6中引入了类(class)这个概念,作为对象的模板,新的class写法知识让原型对象的写法更加清晰,这里不重点谈这个
使用class继承非常简单。子类使用extends关键字表明继承于哪个类,并在子类中调用super(),这相当于使用call()改变this的指向。
如果你能够啃下教程一并且吃透原型链的几个概念的话说明你在前端飞仙的路上又进了一小步···学习最怕的不是慢而是站!这篇教程主要目的对原型链概念进一步加深理解
这篇文章主要讲一下JS中面向对象以及 __proto__,ptototype和constructor,这几个概念都是相关的,所以一起讲了。
图解原型和原型链 原型和原型链是 JS 中不可避免需要碰到的知识点?,本文使用图片思维导图的形式缕一缕原型、原型链、实例、构造函数等等概念之间的关系? Constructor 构造函数 首先我们先
理解原型链与类有利于我们对代码的封装与简化 # JS原型链理论 # 1、函数与对象的关系 函数是对象,对象都是通过函数创建的。 函数与对象并不是简单的包含与被包含的关系。 # 2、原型的类别 显示原型:prototype,是每个函数function独有的属性。 隐式原型: __proto__,是每个对象都具有的属性。 # 3、原型和原型链 原型:一个函数可以看成一个类,原型是所有类都有的一个属性,原型的作用就是给这个类的一个对象都添加一个统一的方法。 原型链:每个对象都有一个__proto__,它指向它的p
原型和原型链据说是面试常考的东西(没面试过,不大清楚),对于初学者来说有一定的难度,但是其实它也非常的简单,几个概念理解好了就没什么问题了,我们先从一个例子出发,然后再引出相关的知识点,下面我们先来看一个例子
即异步的 JavaScript 和 XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更新部分网页
因为在CTF中时常也会考察原型链污染的问题,以前也一直让我捉襟见肘,一直没有系统的学习了解过JS原型的这些相关概念,因此写下本文,通过不断总结大佬的文章,写出自己对于此部分内容的理解。同时建议学习本文前要有对面向对象部分知识的一定理解(无论哪种语言)。
因为上篇文章Prototypal Inheritance没有对一些基本概念作出阐述,所以加入这篇文章作为补充。
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于‘类的',而是通过构造函数(constructor)和原型链(prototype chains)实现的。但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让原型对象的写法更加清晰、更像面向对象编程的语法而已。
每个对象都有一个__proto__属性,该属性是一个对象,被称为原型对象,原型对象有一个constructor属性,指向创建对象的那个函数(obj.constructor === obj.__proto__.constructor)
“函数”是我们在学习js中最常见的对象,每个实例化的对象都有一个私有属性( __proto__ )指向它的构造函数的原型对象(prototype ),每个原型都有一个自己的原型对象,基本上所有的对象最后的原型链都是Object的实例。
javaScript原型链 概念 JavaScript之继承(原型链) 数据结构 var Person = function(){}; Person.prototype.type = 'Person'; Person.prototype.maxAge = 100; 分支主题 prototype(原型) constructor(构造方法) Person.prototype.constructor === Person; 自己的构造,指向自己. 无限循环 proto(原型链) Person.prototype.proto === Object.prototype 指向Object对象prototype(原型) proto(原型链/遗传进化链) 第一层指向,Function对象prototype(原型) 分支主题 Person.proto === Function.prototype 同时Function对象的proto(原型链)也指向Function的prototype(原型) Function.proto === Function.prototype 第二层指向,Object对象prototype(原型) 分支主题 Person.proto.proto === Object.prototype 第三次指向,null Person.proto.proto.proto === null var p = new Person(); console.log(p.maxAge); p.name = 'rainy'; 分支主题 实例对象没有prototype原型属性 仅具有proto(原型链) 第一层指向,Person对象prototype(原型) new Person().proto === Person.prototype 第二层指向,Object对象prototype(原型) new Person().proto.proto == Object.prototype 第二层指向,还等同Person对象的第二层指向 new Person().proto.proto === Person.proto.proto 第三次指向,null new Person().proto.proto.proto === null prototype、proto的关系 dir(Array) 分支主题 dir(new Array()) new Array().proto === Array.prototype true Array.prototype 分支主题 Array. 分支主题 可访问form直接方法 也可访问Array.proto内方法 也可访问Array.proto.proto.... 内方法[继承] 检验是否非进化链proto继承的属性 分支主题 .hasOwnProperty("") 构造指向自己 Array.prototype.constructor === Array true Array.prototype.constructor.prototype.constructor.prototype.constructor .... function Array() { [native code] } proto 分支主题 遗传进化链 or 进化链指针 进化链指针 new String().proto === String.prototype JS内置构造器和自定义函数都是Function构造器的原型(prototype) Array.proto === Function.prototype true String.proto === Function.prototype true Function.proto === Function.prototype true 只有Function.prototype是函数(function)类型 分支主题 为了保证函数构造器们的proto指向的都是函数 不能new的目标 分支主题 没有构造函数(不是函数),不能new 分支主题 分支主题 function才有构造,object没有 继承控制 Object Object.setPrototypeOf(child, parent); Object.prototype.extend class class Porsche extends Car function inherits(Chinese, People) & People.call(this, name, age) inherits(Chinese, People) 分支主题 分支主题 分支主题 作用 c
函数对象和数组对象都属于Object对象,Object对象是一个大的范围,而后两者是一个两种特别的对象
对象(Object)应该算是js中最为重要的部分,也是js中非常难懂晦涩的一部分。更是面试以及框架设计中各出没。写这篇文章,主要参考与JavaScript红宝书(JavaScript高级程序设计 第六章章节)以及各大博主博客。 原文地址:https://github.com/Nealyang/YOU-SHOULD-KNOW-JS
领取专属 10元无门槛券
手把手带您无忧上云