javascript函数原型理解
一、当引用一个对象的属性时,若该对象没有此属性,则会查找该对象的原型,若原型上存在该属性,则返回该属性。
<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函数原型理解的更多相关文章
- javascript 之原型理解
最近一直在了解javascript原型的问题,也算是理解了一点,希望把我所理解的,用简单的例子和说明,让更多人清除的去理解javascript原型 1,原型 prototype 是一个什么东西 我们创 ...
- 对JavaScript闭包和原型理解
最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这 ...
- 深入理解JavaScript系列:史上最清晰的JavaScript的原型讲解
一说起JavaScript就要谈的几个问题,原型就是其中的一个.说了句大话,史上最清晰.本来是想按照大纲式的行文写一下,但写到后边感觉其实就一个概念,没有什么条理性,所以下面就简单按照概念解释的模式谈 ...
- 深入理解javascript函数系列第三篇——属性和方法
× 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...
- javascript中的this与prototype,原型理解
JavaScript 函数调用 JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. this 关键字 一般而言,在Javascript中,this指向函数执行 ...
- 理解JavaScript 的原型属性
1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaS ...
- 函数原型属性-JavaScript深入浅出(三)
前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...
- 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式
刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...
- JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。
回想自己已经工作了有一段时间了,但是自己对JavaScript的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...
随机推荐
- C# js jquery复制textbox内容总结
C# Language//复制: private void button1_Click(object sender, System.EventArgs e) { if(textBox1.Selec ...
- C++ 容器 LIST VECTOR erase
在Vector中 做erase操作就是按照下面的步骤来做的: copy() destory(); 在list容器中 erase操作 destory() deallocate() Vector使用从某 ...
- REDIS 主从复制
REDIS目前给出了一个异步的主从复制版本系统.在redis里 提供了几种方式来完成这个工作. 主从复制主要对应在redis/replication.c这个文件里.源码框架里 分为3部分: Mas ...
- 线上mongodb数据库mLab使用总结
最近在CNode社区看到有人分享了免费的线上mongodb数据库(容量500M),今天去注册了一下,成功的将线下数据库替换掉了,现在就说一下它的使用和配置需要注意的地方: mLab是一款免费的在线mo ...
- Python的名字绑定
Python的名字绑定 在Python中,对象是通过名字进行关联和引用的.Python通过名字绑定操作来引入名字. Python中的所谓的代码块就是一段作为执行单元的程序.比如:模块.函数.类定义.在 ...
- JS中new到底发生了什么
outline prototype 与 __proto__ function 与 object new 到底发生了什么 prototype 与 __proto__ 首先说下在JS中比较容易让人困惑的 ...
- Oracle 数据库SQL性能查看
作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...
- hiho一下18周 RMQ问题再临
RMQ问题再临 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 终于,小Hi和小Ho踏上了回国的旅程.在飞机上,望着采购来的特产--小Hi陷入了沉思:还记得在上上周他们去 ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
- 10天学会phpWeChat——第一天:核心框架的目录结构
phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...