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

     <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. SQL if exists database总是出现语法错误

    SQL if exists总是出现语法错误.望高手纠正._百度知道 http://zhidao.baidu.com/link?url=7VyzcX0V1A3lhBQ1emNt2sTk7QGDuijOq ...

  2. linux学习笔记1-ubuntu的安装与基本设置

    ubuntu的安装 (1) 要装ubuntu首先当然得捣鼓一台机器,当然你用虚拟机也是可以的.本人的这台DELL品牌机是从某师兄脚底下挖出来的,大概很多年没人用了,内存1.25G|||- -,但是硬盘 ...

  3. 线上任务的mysql 重启

    我们的业务是 所使用的数据库是 自己搭建的mysql-server-5.05, 服务器 红帽子6.0. 考虑到 服务的稳定性,计划将数据库向dba进行迁移,由他们进行维护.dba的迁移计划是 1 先创 ...

  4. 【视频演示】FireBase链接已有应用&实时数据库的配置与使用

    全程无编辑,一镜到底,一帧未减,带上犯傻的时间全部不到31分钟:Firebase链接与基础功能使用如此之简单,跟我一起动手,从零开始链接Firebase吧~注意: 输入声源为笔记本自带麦克风,所以风扇 ...

  5. mysql二进制文件操作语法(mysql binary log operate statements)

    开启 binary logs 功能 在 mysql 配置文件中配置 log-bin,重启 mysql my.cnf (on Linux/unix) or my.ini (on Windows) 例子: ...

  6. 测试cookie的读写

    js文件使用utf8编码 <p><img id="img" onclick="javascript:var s=document.createEleme ...

  7. Android学习

    http://www.jikexueyuan.com/path/android 一.概述: 03年10月建立android科技,05年8月被google收购,07年11月成立开放手持设备联盟(Open ...

  8. 安装mysql因为/tmp权限不足而导致ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)的解决方案

    本机是centos 6.5  安装的mysql是5.1的版本. 在安装mysql之后,第一次启动mysql服务的时候,需要/tmp有777(rwxrwxrwx)的权限,然而楼主的/tmp是755(rw ...

  9. Linear Algebra lecture7 note

    Computing the nullspace (Ax=0) Pivot variables-free variables Special solutions: rref( A)=R   rank o ...

  10. python基础篇

    python脚本开头 #!/usr/bin/env python# -*- coding: utf-8 -*print "你好,世界" 不要问为什么,记住就好了 变量定于的规则 变 ...