参考《JavaScript高级教程》实例看:

1.重写原型对象后,首先原型对象的constructor属性值(constructor的指向)会发生改变。

  1. function Person(){
  2. }
  3. Person.prototype={
  4. name:"nike",
  5. age:32,
  6. job:"write",
  7. sayName:function(){
  8. console.log(this.name);
  9. }
  10. };
  11.  
  12. var person5=new Person();
  13.  
  14. console.log(person5.constructor==Person);
    console.log(person5.constructor==Object);

这里重写了Person.prototype原型对象,重写之后变成一个Object对象实例,当然里面的属性和方法即是Person.prototype的属性方法。

里面没有显示的设置constructor属性,我们看一下constructor属性如何得来。

现在,Person.prototype已经是一个Object实例对象了,而Object构造函数在创建之初会自动生成它的prototype原型对象,同时原型对象会自动获取一个constructor属性(指向构造函数Object)。所有的Object实例对象通过_proto_都会获得原型对象里的constructor属性。

事情很明白了,当在读取person5.constructor属性时,按照原型链查找,最终在Object.prototype上找到constructor属性,它是指向Object构造函数的。

所以我们最后看到的结果也应该是这样的

  1. console.log(person5.constructor==Person);//fasle
    console.log(person5.constructor==Object);//true

  1. 如果不想因为重写prototype而改变了constructor的指向,那么就在重写的时候显式设置constructor属性的值。
  1. Person.prototype={
  2. constructor:Person,
  3. name:"nike",
  4. age:32,
  5. job:"write",
  6. sayName:function(){
  7. console.log(this.name);
  8. }
  9. };

  1.  

2.重写原型对象后,对实例对象通过_roto_访问原型对象的属性方法有影响。

我们知道构造函数的prototype属性是用来指向原型对象的,现在重写Person.prototype属性意味着它指向了一个新的对象(称为新的原型对象),不再指向函数创建时生成的那个原型对象了。(感觉绕的话,看一下js的内存分配)

在调用new Person()创建对象实例时,会有一个内部属性_proto_指向原型对象Person.prototype

1)如果new Person()创建实例发生在重写Person.prototype之前,那么_proto_指向的是函数创建时生成的原型对象。

2)如果new person()创建实例在重写Person.prototype之后,_proto_始终都是指向原型对象的,不过此时指向的是改写后的新原型对象。

  1.  情况1
  1. function Person(){
  2. }
  3. var person5=new Person();
  4.  
  5. Person.prototype={
  6. constructor:Person,
  7. name:"nike",
  8. age:32,
  9. job:"write",
  10. sayName:function(){
  11. console.log(this.name);
  12. }
  13. };
  14. person5.sayName();//TypeError: person5.sayName is not a function

输出结果:TypeError: person5.sayName is not a function

情况2:

  1. function Person(){
  2. }
  3.  
  4. Person.prototype={
  5. constructor:Person,
  6. name:"nike",
  7. age:32,
  8. job:"write",
  9. sayName:function(){
  10. console.log(this.name);
  11. }
  12. };
  13. var person5=new Person();
  14.  
  15. person5.sayName();

输出结果:nike

在实际应用中用的是情况2.

重写prototype原型后哪些东西改变了的更多相关文章

  1. JS原型,Prototype,原型

    对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...

  2. 你不知道的JavaScript--Item15 prototype原型和原型链详解

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  3. JavaScript prototype原型和原型链详解

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  4. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  5. javascript prototype原型链的原理

    javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...

  6. js prototype 原型

    //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E4% ...

  7. Java设计模式:Prototype(原型)模式

    概念定义 使用原型实例指定待创建对象的种类,并通过拷贝该原型来创建新的对象.Prototype模式允许一个原型对象克隆(复制)出多个与其相同的对象,而无需知道任何如何创建的细节. 应用场景 对象的创建 ...

  8. 7、Prototype 原型模式 通过复制创造实例 创造型模式

    2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...

  9. 设计模式(1)--Prototype(原型模式)--创建型

    1.模式定义: 原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 2.使用场景: 在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的 ...

随机推荐

  1. windos环境python3.5安装 paramiko

    一.执行命令pip install paramiko,情况如下: C:\Users\ZFH>pip install paramikoCollecting paramiko  Downloadin ...

  2. 黑马day14 踢人小案例

    本案例介绍: 使用监听器来实现踢人小案例,仅仅有管理员才有踢人的功能. 1.搭建开发环境,导入本案例须要的jar包.以及一个准备好的数据库工具类:提供数据源的方法...当中我已经在数据库中加入了三个用 ...

  3. Fragmen直接来回切换deno

    思路: 第一步.建立一个activity.用来管理fragment. 第二步'获取fragmentManger 和fragmentTraction. private FragmentManager f ...

  4. 用java实现螺旋数组

    接收数组的行数和列数,返回正序和倒序的螺旋数组 package cn.baokx; public class Test { public static void main(String[] args) ...

  5. Android组件系列----ContentProvider内容提供者【1】

    [正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...

  6. m_Orchestrate learning system---二十五、复制类的时候最容易出现的错误是什么

    m_Orchestrate learning system---二十五.复制类的时候最容易出现的错误是什么 一.总结 一句话总结:命名空间错误导致Analyze类虽然继承了Base类,但是没有执行里面 ...

  7. 关于安装Ubuntu系统时提示“分配到/的分区/dev/sdax开始于xxxx字节,使用磁盘的最小对齐,这可能造成非常差的性能..."的解决办法

    由于Windows系统的VMware出了一些问题,索性就不用VM了,直接装上双系统好了.但是在最后安装时出现错误提示“分配到/的分区/dev/sdc1开始于3584字节,使用磁盘的最小对齐,这可能造成 ...

  8. MVC获取当前Controller/Action名称

    1.视图中获取: var actionName=ViewContext.RouteData.Values["action"].ToString().ToLower(); var c ...

  9. Reading and writing

    A text file is a sequence of characters stored on a permanent medium like a hard drive, flash memory ...

  10. java9新特性-8-语法改进:钻石操作符(Diamond Operator)使用升级

    1.使用说明 我们将能够与匿名实现类共同使用钻石操作符(diamond operator) 在java8中如下的操作是会报错的:   编译报错信息:'<>' cannot be used ...