关于javascript中原型和原型链的理解

对于js中的原型以及原型链,笔者一直觉得有些迷惑,对于其中的概念是大致理解的,但是如果让笔者说出来就感觉比较难以清晰的表达出来,所以就在这里做一下总结,有疑问的时候再翻出来回顾一下

首先,我们看一段代码

 function Person() {

 }

 var person = new Person();

 console.log(person);
 console.log(Person);
 console.log(Object)

 console.log(person.prototype);
 console.log(Person.prototype);
 console.log(Object.prototype);

 console.log(person.constructor);
 console.log(Person.constructor);
 console.log(Object.constructor);

 console.log(person.__proto__);//注意此处前后各是两个下划线,以下同理
 console.log(Person.__proto__);
 console.log(Object.__proto__)

 console.log(person.__proto__ === Person.prototype );
 console.log(Person.__proto__ === Object.prototype); 

看到这里,如果你对上面的输出没有任何疑问,并且回答的准确无误,那么阁下可以优雅的关掉这个页面,该忙啥忙啥吧,大佬就不要在这凑热闹啦,如果你有什么疑问的话还请你继续看下去

首先我们针对上面的代码明确以下几个概念

1、prototype,原型,那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。(在js中有这么一个概念:万物皆对象。请大家记住这个概念,在es6中体现的尤为明显)

2、__proto__,这是每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

3、constructor,每个原型都有一个 constructor 属性指向关联的构造函数。

然后我们引入原形链的概念:当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

接下来我们看下上面的代码的输出:

 function Person() {

 }

 var person = new Person();

 console.log(person);//Person {}
 console.log(Person);//[Function: Person]
 console.log(Object)//[Function: Object]

 console.log(person.prototype);//undefined
 console.log(Person.prototype);//Person {}
 console.log(Object.prototype);//{}

 console.log(person.constructor);//[Function: Person]
 console.log(Person.constructor);//[Function: Function]
 console.log(Object.constructor);//[Function: Function]

 console.log(person.__proto__);//Person {}
 console.log(Person.__proto__);//[Function]
 console.log(Object.__proto__)//Function

 console.log(person.__proto__ === Person.prototype );//true
 console.log(Person.__proto__ === Object.prototype); //false  ??这里笔者有一点不是很理解,如果有大佬可以解释下的话就再好不过了
 console.log(Object.getPrototypeOf(person) === Person.prototype) // true

 console.log(Object.getPrototypeOf(Object) == Person.__proto__) //true

 console.log({Object}.prototype,‘123‘) // {}

然后我们可以用一张图来表示下之前梳理的关系

顺便还要说一下,图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。

本篇知识点部分来自于https://github.com/mqyqingfeng/Blog/issues/2,大家有兴趣的可以去看看,作者写的js系列还是很棒棒的

原文地址:https://www.cnblogs.com/yunzhongjun/p/10661284.html

时间: 2024-10-08 09:47:47

关于javascript中原型和原型链的理解的相关文章

JavaScript中原型和原型链

原型[prototype]: 为其他对象提供共享属性的对象. 每个函数都有一个原型(prototype)属性,这个属性是一个指针,指向一个对象,这个对象包含特定实例共享的一些属性和方法. 以例服人: 这个例子说明了原型对象是共享的,并且是一个指针,并且对象的实例中也有指向prototype指向对象的指针. function Animal(name) { this.name = name || "动物"; } Animal.prototype.runs = function() { co

js中原型和原型链理解

js中属性的继承以及查找都会用到原型链的知识,对于深入学习js的人来说是一个难点也是一个重点,下面梳理下对于原型以及原型链的理解. 首先,我们要知道什么是原型以及原型链?他们有什么样的作用? 可以理解为JS对象在创建时都会与之关联另一个对象,这就是我们所说的原型,每一个对象都会从原型"继承"属性.下图表示了构造函数与实例原型的关系,其中Object.prototype表示实例原型. 那么实例与实例原型又是怎么联系的呢?接下来又要说到另一个属性__proto__,每一个JS对象都有一个属

关于JS面向对象中原型和原型链以及他们之间的关系及this的详解

一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__proto__属性, 当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性指向 构造函数的prototype. 1 zhangsan.__proto__==Person.prototype 注:在上述代码中Person是构造函数,zhangsan则是该构造函数的一个实例化对象.

理解JavaScript:继承与原型链

本文翻译自https://wildlyinaccurate.com/understanding-javascript-inheritance-and-the-prototype-chain Javascript里的一切几乎都是对象,每一个对象都有一个链接到其他对象的内部属性,我们称之为prototype (原型).原型对象自己也有自己的原型对象,以此类推,这时候原型链就出来了.如果你追踪原型链,你最终会到达原型为 null的内核 Object,这是原型链的终点. 原型链的作用是什么呢?当我们访问

对Javascript 类、原型链、继承的理解

一.序言 ??和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承.(以下不讨论ES6中利用class.extends关键字来实现类和继承:实质上,ES6中的class.extends关键字是利用语法糖实现的) Javascript灵活到甚至可以实现接口的封装(类似Java中的Interface和implements). 二.类的实现 1.我对类的理解 ??首先,

图解JavaScript中的原型链

转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof obj和obj instanceof Type来识别类型,那么两者的区别在哪?先来看两段代码 <!--typeof obj的方式判断--> <script>    var str = "toby";    console.log(typeof str);// stri

原型链的理解

### 原型链的理解 #### 概念 + javascript每一个对象**包括原型对象**都有一个内置的`proto`属性指向创建他的函数对象的原型对象,即`prototype`属性 #### 作用 + 实现对象的继承 ### 理解 1.函数对象 + 在javascript中,函数就是对象 2.原型对象 + 当定义一个函数对象的时候,会包含一个预定的属性,`prototype`,这就属性称之为原型对象 3.\__proto__ + javascript 在创建对象的时候,都会有一个\_prot

对原型链的理解 语言表达能力不好 直接用代码,哈

分享一下 我对原型和原型链的理解 原型对象: function People(nameValue,ageValue,fondValue)            {                this.name = nameValue;                this.age = ageValue;                this.fond = fondValue;            } People.prototype.rule = function()         

面向对象(2 )构造函数 原型 原型链的理解

面向对象(2) 原型 原型链的理解 1.面向对象的目的就是生成对象object. 2.生成对象的方式 (1)单例模式(字面量定义)var obj={} (2)类的实例 var obj=new Object() (3)工厂模式 (4)构造函数 工厂模式和构造函数的区别? 工厂模式,生成的对象必须要返回,构造函数模式不用return,构造函数模式默认return旳是this,在构造函数内的this就是实例对象. 构造函数如果人为return的不是对象,直接忽略,如果人为return的是对象,就取代t