原型对象

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

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

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

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

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

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

function Person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}

实例化

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

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

person1.changeName === person2.changeName 

...false

person1.changeName === Person.changeName 

...false
//因为this绑定实例,所以方法都是各自实例独立的方法。所以说this跟python中self类似

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

Person.prototype.changeName2= function (name)
{
this.lastname=name;
} person1.changeName2 === person2.changeName2; ...true person1.__proto__ === person2.__proto__; ...true
person1.__proto__ === Person.prototype; ...true
person1.__proto__ ...{changeName2: ƒ, constructor: ƒ}

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

person1.__proto__.constructor
...
ƒ Person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
this.changeName=changeName;
function changeNa…

原型链

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

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

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

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

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

class Teacher extends Person{
constructor(firstname,lastname,age,eyecolor,subject) {
super(firstname,lastname,age,eyecolor);
this.subject = subject;
}
teach(){
console.log(this.subject);
}
}

实例化

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

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

>>>teacher1.__proto__

...Person {constructor: ƒ, teach: ƒ}

>>>teacher1.__proto__.constructor

...class Teacher extends Person{
...
} >>>teacher1.__proto__.__proto__ ...{changeName2: ƒ, constructor: ƒ} >>>teacher1.__proto__.__proto__.constructor ...function Person(firstname,lastname,age,eyecolor)
{
....
} >>>teacher1.__proto__.__proto__.__proto__ ...{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …} >>>teacher1.__proto__.__proto__.__proto__.constructor ...Object() { [native code] } >>>teacher1.__proto__.__proto__.__proto__.__proto__ ...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. cookie和session,cookie和web storage

    一.cookie和session cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式. session指的是访问者从到达某个特定页面到离开为止 ...

  2. JZOJ10004 列车调度

    [JZOJ100041]列车调度 Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 ...

  3. c#之线程基础(一)

    可以认为线程是一个虚拟进程,用于独立运行一个特定的程序. 1.使用c#创建线程 using System; using System.Threading; //3 namespace MutiThre ...

  4. 可能是把 ZooKeeper 概念讲的最清楚的一篇文章

    转载自:https://github.com/Snailclimb/JavaGuide/blob/master/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6/ZooKeep ...

  5. Python:numpy中shape和reshape的用法

    >>> w=np.zeros((5,6))>>> warray([[ 0.,  0.,  0.,  0.,  0.,  0.],       [ 0.,  0.,  ...

  6. Msfvenom命令总结大全

    1.    –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...

  7. nishang的介绍与使用

    0x01前言 Nishang是一个PowerShell攻击框架,它是PowerShell攻击脚本和有效载荷的一个集合.Nishang被广泛应用于渗透测试的各个阶段,本文主要介绍如何使用Nishang的 ...

  8. 域渗透-msdtc实现dll劫持后门

    最近用的多  一个实用小tips 文章参考原创Shadow Force大牛  翻译文章参考三好大佬 利用MSDTC服务加载后门dll,实现自启动后门 后门思路可以查看趋势科技文章 https://bl ...

  9. 关于参加AWD攻防比赛心得体会

    今天只是简单写下心得和体会 平时工作很忙 留给学习的时间更加珍少宝贵. 重点说下第二天的攻防比赛吧  . 三波web题 .涉及jsp,php,py. 前期我们打的很猛.第一波jsp的题看到有首页预留后 ...

  10. PHP 插入排序 -- 折半查找

    1. 折半查找  -- Binary Insertion Sort 时间复杂度 : O(n^2) 适用条件 : 相对直接插入排序,减少了数值的比较次数.适用于需要排序的数码比较少的情况. <?p ...