一、当引用一个对象的属性时,若该对象没有此属性,则会查找该对象的原型,若原型上存在该属性,则返回该属性。

     <script type="text/javascript">
var o={age:23,name:'zhangsan'};//直接定义的对象
var Foo=function(){
this.name='zhangsan';
}
var f=new Foo();//由构造函数生成的对象
console.log("先看下对象o的原型链");
console.log("o.__proto__===Object.prototype",o.__proto__===Object.prototype);
console.log("Object.prototype.__proto__===null",Object.prototype.__proto__===null);
console.log("先看下对象f的原型链");
console.log("f.__proto__===Foo.prototype",f.__proto__===Foo.prototype);
console.log("Foo.prototype.__proto__===Object.prototype",Foo.prototype.__proto__===Object.prototype);
console.log("Foo.prototype.constructor===Foo",Foo.prototype.constructor===Foo);
</script>

上面代码运行结果如下:

从运行结果可知:

  1.一个普通对象的__proto__指向Object.prototype,而Object.prototype.__proto__指向null.到达原型链的终点。

  2.由构造函数构造的对象,其__proto__指向Foo.prototype,而Foo.prototype.__proto__指向Object.prototype。

  3.函数Foo.prototype.constructor指向Foo本身。

 二、改变函数prototype的例子

         var a={
name:'zhangsan',
age:20
};
function Foo(){
this.sex='man';
}
Foo.prototype=a;//此处改变了函数的prototype
var f=new Foo();
console.log("f.__proto__===Foo.prototype",f.__proto__===Foo.prototype);
console.log("f.__proto__===a",f.__proto__===a);
console.log("Foo.prototype.__proto__===Object.prototype",Foo.prototype.__proto__===Object.prototype);

运行结果如下:

由运行结果可知:

  1.此对象的 __proto__仍指向Foo.prototype,也指向对象a,a的__proto__指向Object.prototype。

  2.针对上面这种情况,我们再测试两个:

  console.log(Foo.prototype.constructor===Object);  //true 如果没有改变函数Foo.prototype,那么Foo.prototype.constructor===Foo,这里改变了Foo.prototype,导致Foo.prototype===a。

  console.log(a.constructor===Object);  //普通对象的constructor为Object。

三、修正Foo.prototype.constructor=Foo之后

         var a={
name:'zhangsan',
age:20
};
function Foo(){
this.sex='man';
}
Foo.prototype=a;//此处改变了函数的prototype
Foo.prototype.constructor=Foo;//这里修正了constructor,但是产生了一个问题
var f=new Foo();
console.log("f.__proto__===Foo.prototype",f.__proto__===Foo.prototype);// true
console.log("f.__proto__===a",f.__proto__===a);//true
console.log("Foo.prototype.__proto__===Object.prototype",Foo.prototype.__proto__===Object.prototype);//true
console.log(Foo.prototype.constructor===Foo);//true
console.log(a.constructor===Foo);//true

在最后位置,a的constructor也被改变了。为什么呢?因为a是一个对象,将引用传给了Foo.prototype,这样Foo.prototype改变了,也影响到了a。

最后附上一张神图,此图可以解惑了-.-

javascript函数原型理解的更多相关文章

  1. javascript 之原型理解

    最近一直在了解javascript原型的问题,也算是理解了一点,希望把我所理解的,用简单的例子和说明,让更多人清除的去理解javascript原型 1,原型 prototype 是一个什么东西 我们创 ...

  2. 对JavaScript闭包和原型理解

    最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这 ...

  3. 深入理解JavaScript系列:史上最清晰的JavaScript的原型讲解

    一说起JavaScript就要谈的几个问题,原型就是其中的一个.说了句大话,史上最清晰.本来是想按照大纲式的行文写一下,但写到后边感觉其实就一个概念,没有什么条理性,所以下面就简单按照概念解释的模式谈 ...

  4. 深入理解javascript函数系列第三篇——属性和方法

    × 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...

  5. javascript中的this与prototype,原型理解

    JavaScript 函数调用 JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. this 关键字 一般而言,在Javascript中,this指向函数执行 ...

  6. 理解JavaScript 的原型属性

    1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaS ...

  7. 函数原型属性-JavaScript深入浅出(三)

    前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...

  8. 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式

    刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...

  9. JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。

    回想自己已经工作了有一段时间了,但是自己对JavaScript的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...

随机推荐

  1. 遍历 Input检测是否有重复的值

    在项目中需要遍历某个Table中的Input输入是否有重复的值,为此基于Jquery写了两种实现方式(关键在于取值方式): 方法1: function CheckGoodsNo() { var ish ...

  2. Android之自定义控件-城市选择

    实现效果: 图片素材:           --> 首先, 城市数据字节放在 Json 文件, 就不网络获取了. city.json 存放 Json 数据: { "result&quo ...

  3. <随便写写>

    # Markdown用法 整理

  4. MATLAB中fft函数的正确使用方法

    问题来源:在阅读莱昂斯的<数字信号处理>第三章离散傅里叶变换时,试图验证实数偶对称信号的傅里叶变换实部为偶对称的且虚部为零.验证失败.验证信号为矩形信号,结果显示虚部是不为零且最大幅值等于 ...

  5. 两个list取不同值

    转自同名博文,未知真正出处,望作者见谅 如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素 ...

  6. 今天第一次接触到typescript,看了第一个知识点就是变量的声明,来回忆回忆,做做笔记

    以前只用过JavaScript原生写网站特效,今天还是第一次听说typescript的,然后看了一下它的基本知识,感觉很像Java,真的太像了,但是又有不同点.很让我惊奇看到的第一个知识点就和以前不同 ...

  7. C#循环语句练习2

    1.羽毛球拍15元,球3元,水2元,有200元,每一种至少买一件,问有几种买法? 2.洗发水15元,牙刷5元,香皂2元,有150元,每一种至少买一件,问有几种买法? 3.用100元钱买100只鸡,公鸡 ...

  8. dentry与inode有什么联系和区别

    我们在进程中要怎样去描述一个文件呢?我们用目录项(dentry)和索引节点(inode).它们的定义如下: struct dentry {struct inode                    ...

  9. C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏

    const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...

  10. WP8应用上传失败查错

    开发的一个应用,好久没有更新. 最近做了些修改,在设备上安装测试,没什么 问题,上传到STORE,收到反馈说有两个操作必挂. 知道了直接设备安装测试和从STORE上下载,会有些不同. http://s ...