资讯专栏INFORMATION COLUMN

JavaScript,从示例理解重写原型后的指针指向

godlong_X / 1102人阅读

摘要:我们知道,调用构造函数时会为实例添加一个指向最初原型的指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。

  

我们知道,调用构造函数时会为实例添加一个指向最初原型的指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。

怎么理解这句话,下面我们通过实例来解释下,如有不对,请指正,虚心受教。

function Person(){

}

Person.prototype.sayName=function(){
    alert("TONY");
}
var friend1=new Person();
var keys1=Object.keys(Person.prototype);

//重写原型
Person.prototype = {
         constructor:Person,
         name:"TIMY",
         age:29,
         job:"SOFT ENGINEER",
         sayName:function(){
             alert(this.name);
         }
     };

var friend2=new Person();
var keys2=Object.keys(Person.prototype);

friend1.sayName();  //TONY
friend2.sayName();  //TIMY
alert(keys1);       //sayName
alert(keys2);       //constructor,name,age,job,sayName

为什么friend1和friend2输出的结果不同,因为friend1时还没有重写,friend2时已经重写原型。

那么问题来了,这中间指针是怎么指向的?

因为在实例化的时候,firend1的原型指针指向了构造函数的原型对象,这个的原型对象只有一个sayName方法,输出的是TONY。

随后,给构造函数附上了新的原型对象,即将构造函数指向新的原型对象,但是实例friend1的原型指针依然还傻傻的指向原来的空原型对象{}

这个时候再实例化的对象friend2,就有了新的原型的sayName方法了,输出是TIMY。

其实通过Object.keys(Person.prototype)语句就看出了不同情况下原型的所有属性和方法。
重写前指向的是最初原型,只有一个sayName方法,重写后,构造函数就指向了新的原型,虽然新的原型也有sayName方法,但是注意,这已经不是之前的了,只是名字相同而已。

就酱紫滴,还在学习中。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85699.html

相关文章

  • 我来重新学习 javascript 的面向对象(part 2)

    摘要:先来说其实构造函数也有,原型对象有,实例有也有,或者更加笼统的说,所有对象都是有的。构造函数的原型对象上的会指向构造函数。由于属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。 续上一集内容,通过构造函数的方式,成功地更新了生产技术,老板笑呵呵,工人少奔波,只是问题总比办法多,又遇到一个新问题,就是会造成一些资源的重复和浪费,那么经过工程师们的智慧交流,他们产生了一个新技...

    silvertheo 评论0 收藏0
  • JavaScript 闯关记》之原型原型

    摘要:像和这样的原生构造函数,在运行时会自动出现在执行环境中。理解原型对象在默认情况下,所有原型对象都会自动获得一个构造函数属性,这个属性包含一个指向属性所在函数的指针。而通过这个构造函数,我们还可继续为原型对象添加其他属性和方法。 原型链是一种机制,指的是 JavaScript 每个对象都有一个内置的 __proto__ 属性指向创建它的构造函数的 prototype(原型)属性。原型链的...

    cjie 评论0 收藏0
  • JavaScript高程第六章:继承-理解与实践

    摘要:高程第六章继承理解与实践昨日细细的读了一遍高程现在写篇文章来巩固下认知吧读首先是从中读到了什么我自己也在读书的时候用笔记下了各个部分的点现在等于阅读笔记回忆下书本理解基础第五版中规定了两种属性数据属性访问器属性数据属性包含一个数据值的位 JavaScript高程第六章:继承-理解与实践昨日细细的读了一遍JavaScript高程,现在写篇文章来巩固下认知吧. 读 首先是从中读到了什么,我...

    mozillazg 评论0 收藏0
  • JS面向对象的程序设计之继承的实现 - 原型

    摘要:简单回顾一下构造函数原型和实例对象之间的关系每个构造函数都有一个原型对象。找到生成构造函数的原型对象的构造函数,搜索其原型对象,找到了。 JS面向对象的程序设计之继承的实现 - 原型链 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《JavaS...

    zhaochunqi 评论0 收藏0
  • 基础二:javascript面向对象、创建对象、原型和继承总结(上)

    摘要:创建对象两个基本方法创建对象最基本的两个方法是构造函数和对象字面量。当调用构造函数创建一个新的实例对象后,该实例内部会有一个指针指向构造函数的原型对象。码农构造函数在不返回值的情况下,默认会返回新对象实例。 前言:本文主要总结一下javascript创建对象的方法、原型、原型链和继承,但是先从创建对象的几种方法开始,延伸到原型模式创建对象以及其它模式。继承本来想一块写了,发现太多内容了...

    fevin 评论0 收藏0

发表评论

0条评论

godlong_X

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<