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的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...
随机推荐
- Html中代码换行造成空格间距的问题
Html中代码换行造成空格间距的问题解析 解决方法: 一.简单粗爆不换行 写代码的时候不要换行,input等在一行输写,那么将解决该问题.但是代码就变得不再那么容易好看. 二.设置父级块的字体大小为0 ...
- C++类大小
对于C++中类的大小,主要针对于无成员的空类大小,编译器会对该类进行优化,情况主要分为是否有虚表(虚函数)两种类型,对于无虚函数的类,该类大小均为1个字节(编译器插入一个char表示该类的存在),而出 ...
- Hadoop集群搭建安装过程(二)(图文详解---尽情点击!!!)
Hadoop集群搭建安装过程(二)(配置SSH免密登录)(图文详解---尽情点击!!!) 一.配置ssh无密码访问 ®生成公钥密钥对 1.在每个节点上分别执行: ssh-keygen -t rsa(一 ...
- 深入理解kmp中的next数组
next数组 1. 如果对于值k,已有p0 p1, ..., pk-1 = pj-k pj-k+1, ..., pj-1,相当于next[j] = k. 此意味着什么呢?究其本质,next[j] = ...
- bootstrap-14
基础导航条: 使用方法:1. 首先在制作导航的列表(<ul class="nav">)基础上添加类名"navbar-nav" 2.在列表外部添加一个 ...
- yii gii自动生成的curd添加批量删除实例
1.在视图中 CGridView中的columns添加,作用是添加多选框 代码如下 复制代码 array( 'selectableRows' => 2, 'foot ...
- linux创建静态库
[1]新建源程序staticlib.c /************************************************************************* > ...
- 浅谈VB.Net 程序的编译和动态编译
---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...
- 副本限制修改-M端
魔兽的副本很多,也有很多副本都有进入的限制,比方说最普遍的,有些副本有级别限制,没达到要求的级别是不能进入对应副本的还有些副本是有任务需求限制,比方说黑翼副本,需要做完一个任务之后才可以进入副本当然, ...
- JavaScript 常用小功能
判断一个是否是隐藏状态 $(curid).is(":visible") 响应回车 $("#password").keydown(function (e) { ...