原型对象

1.每个对象一定会有一个原型对象

2.原型对象实际是构造实例对象的构造器中的一个属性,只不过这个属性是个对象

3.这个原型对象中的属性与方法,都会被对象实例所共享(类似python中的类方法,类属性)

4.但,原型对象的属性不是对象实例的属性,只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上。

5.JavaScript对每个创建的对象都会设置一个属性__proto__ ,指向它的原型对象xxx.prototype。

比如按照传统方法创建一个构造器

  1. function Person(firstname,lastname,age,eyecolor)
  2. {
  3. this.firstname=firstname;
  4. this.lastname=lastname;
  5. this.age=age;
  6. this.eyecolor=eyecolor;
  7. this.changeName=changeName;
  8. function changeName(name)
  9. {
  10. this.lastname=name;
  11. }
  12. }

实例化

  1. var person1=new Person("John","Doe",50,"blue");
  2. var person2=new Person("Sally","Rally",48,"green");

如上面person1和person2的changeName实际是绑定在实例上的

  1. person1.changeName === person2.changeName
  2.  
  3. ...false
  4.  
  5. person1.changeName === Person.changeName
  6.  
  7. ...false
  8. //因为this绑定实例,所以方法都是各自实例独立的方法。所以说this跟python中self类似

如果想要一种所有实例共享的方法或属性,那只有给Person.prototype中添加修改方法或属性,则person1和person2都会得到更新,且person1.__proto__ 等同于Person.prototype

  1. Person.prototype.changeName2= function (name)
  2. {
  3. this.lastname=name;
  4. }
  5.  
  6. person1.changeName2 === person2.changeName2;
  7.  
  8. ...true
  9.  
  10. person1.__proto__ === person2.__proto__;
  11.  
  12. ...true
  13. person1.__proto__ === Person.prototype;
  14.  
  15. ...true
  16. person1.__proto__
  17.  
  18. ...{changeName2: ƒ, constructor: ƒ}

上面person1.__proto__(即Person.prototype)除了changeName2属性外,还有一个constructor属性,这个是指向创建当前对象的构造函数

  1. person1.__proto__.constructor
  2. ...
  3. ƒ Person(firstname,lastname,age,eyecolor)
  4. {
  5. this.firstname=firstname;
  6. this.lastname=lastname;
  7. this.age=age;
  8. this.eyecolor=eyecolor;
  9. this.changeName=changeName;
  10. function changeNa

原型链

1.由于xxx.prototype也是个某个构造器的实例对象,所以它也有__proto__指向一个原型对象yyy.prototype,所以会成链

2.原型链的顶端或源头,是Object.prototype(有点像基因链呀,继承也是通过这条链实现的)

3.读取实例对象的某个属性或方法时,JavaScript引擎按照 对象-->原型对象a-->a的原型对象b----,最后到Object.prototype如果还是找不到,就返回undefined

4.如果实例对象属性和原型对象属性名一样,同python,优先实例自身的属性

按照上面例子构造一个继承Person的构造器

  1. class Teacher extends Person{
  2. constructor(firstname,lastname,age,eyecolor,subject) {
  3. super(firstname,lastname,age,eyecolor);
  4. this.subject = subject;
  5. }
  6. teach(){
  7. console.log(this.subject);
  8. }
  9. }

实例化

  1. var teacher1=new Teacher("Tim","D",25,"blue","math");

在实例中查看原型链的情况

  1. >>>teacher1.__proto__
  2.  
  3. ...Person {constructor: ƒ, teach: ƒ}
  4.  
  5. >>>teacher1.__proto__.constructor
  6.  
  7. ...class Teacher extends Person{
  8. ...
  9. }
  10.  
  11. >>>teacher1.__proto__.__proto__
  12.  
  13. ...{changeName2: ƒ, constructor: ƒ}
  14.  
  15. >>>teacher1.__proto__.__proto__.constructor
  16.  
  17. ...function Person(firstname,lastname,age,eyecolor)
  18. {
  19. ....
  20. }
  21.  
  22. >>>teacher1.__proto__.__proto__.__proto__
  23.  
  24. ...{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
  25.  
  26. >>>teacher1.__proto__.__proto__.__proto__.constructor
  27.  
  28. ...Object() { [native code] }
  29.  
  30. >>>teacher1.__proto__.__proto__.__proto__.__proto__
  31.  
  32. ...null

可以发现teacher1的原型链是 Teacher.prototype ---> Person.prototype ---> Object.prototype ---> null

JavaScript-原型对象与原型链的更多相关文章

  1. javascript原型对象与原型链

    在javascript中,当系统加载构造函授后 ,会自动在内存中增加一个对象,这个对象就是原型对象.构造函数和原型对象在内存中表现为相互独立,但两者之间还存在联系,构造函数的prototype是原型对 ...

  2. 三张图较为好理解JavaScript的原型对象与原型链

    最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...

  3. 还在问什么是JavaScript构造函数、实例、原型对象以及原型链?看完这篇你就懂

    1概述 ES6, 全称 ECMAScript 6.0 ,2015.06 发版.在ES6之前,对象不是基于类创建的,而是用一种称为构造函数的特殊函数来定义对象和它们的特征. 2构造函数 构造函数是一种特 ...

  4. 【javascript】对原型对象、原型链的理解

    原型对象,原型链这些知识属于基础类知识.但是平时开发过程中也很少用到. 看网上的意思,原型链用于es5开发场景下的继承.es6有了类语法糖之后,就自带继承了. 通过理解,个人画了一张原型链解构的关系图 ...

  5. JavaScript基础之原型对象和原型链

    原型对象 原型对象简单来说就是函数的原型所指向的对象.前面说原型的时候,说了Object.prototype所指对象就是Object(函数)的原型对象.在每个函数的原型对象中,默认会有construc ...

  6. javascript学习-对象与原型

    javascript学习-对象与原型 Javascript语言是符合面向对象思想的.一般来说,面向对象思想需要满足以下三个基本要求: 封装,Javascript的对象可以自由的扩充成员变量和方法,自然 ...

  7. jacascript 构造函数、原型对象和原型链

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 先梳理一下定义: 我们通常认为 object 是普通对象,function 是函数对象: Function ...

  8. 对ES6中类class以及实例对象、原型对象、原型链之间关系的详细总结

    1. 类 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后用这个类来实例化对象.即类的用途:实例化对象. // 创建一个Person类 class Person { } // ...

  9. 三张图搞懂JavaScript的原型对象与原型链

    对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张 ...

  10. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

随机推荐

  1. 【JZOJ5264】化学

    Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Hint   题解: 这个题目通过30%部分分的提示,我们可以猜出这 ...

  2. BZOJ 4621: Tc605

    Description 最初你有一个长度为 N 的数字序列 A.为了方便起见,序列 A 是一个排列. 你可以操作最多 K 次.每一次操作你可以先选定一个 A 的一个子串,然后将这个子串的数字全部变成原 ...

  3. 第10项:重写equals时请遵守通用约定

      重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...

  4. 设置Linux支持中文

    1.首先在command输入locale,可以看到Linux下默认的系统语言的是英文 2.vim ~/.bashrc打开这个文件,该文件夹相当于系统配置文件 3.打开后,将后三行命令输入到文档中,最后 ...

  5. 某PHP发卡系统SQL注入

    源码出自:https://www.0766city.com/yuanma/11217.html 安装好是这样的 审计 发现一处疑似注入的文件 地址:/other/submit.php 看到这个有个带入 ...

  6. 2019关于phpstudy软件后门简单分析

    2019.9.20得知非官网的一些下载站中的phpstudy版本存在后门文件   说是官网下的就没有后门 20号出现的新闻 今天phpstudy官网21号又更新一波 不太好说这是什么操作哦 此地无银三 ...

  7. Redis 3.0中文版学习(二)

    网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-middle.html 1.Redis的列表: 采用链表的实现方法 ...

  8. [NOIp2013] luogu P1970 花匠

    scy居然开网了. 题目描述 你有一个序列 aaa,你需要保留尽量多的数,使得剩下的数满足以下条件中的一个: ∀x∈[2,n−1]∩N∗\forall x\in[2,n-1]∩\N^*∀x∈[2,n− ...

  9. Javascript字符串常用方法详解

    字符串 字符串就是一个或多个排列在一起的字符,放在单引号或双引号之中. 'abc'"abc" length属性 js里的字符串类似于数组,都是一个一个字符拼凑在一起组成的,因此可以 ...

  10. Mybaits 源码解析 (一)----- 搭建一个mybatis框架(MyBatis HelloWorld)

    源码分析之前先搭一个mybatis的demo,这个在看源码的时候能起到了很大的作用,因为在看源码的时候,会恍然大悟,为什么要这么配置,为什么要这么写.(老鸟可以跳过这篇) 开发环境的准备 创建mave ...