代码信息来自于http://ejohn.org/apps/learn/。

向函数的原型中添加方法

function Ninja(){} 

Ninja.prototype.swingSword = function(){
return true;
}; var ninjaB = new Ninja();
console.log( ninjaB.swingSword(), "Method exists and is callable." );

通过实例化对象可以访问,因为构造函数实例化的对象拥有__proto__属性这个属性的值是构造函数的原型,如果实例化对象本身没有这个方法,它自动去访问__proto__,所以可以调用原型里的方法。

调用顺序

function Ninja(){
this.swingSword = function(){
return true;
};
} // Should return false, but will be overridden
Ninja.prototype.swingSword = function(){
return false;
}; var ninja = new Ninja();
console.log( ninja.swingSword(), "调用的是实例化对象方法,而非原型的" );

这个例子可以很好的说明调用顺序:先访问实例化对象自身,如果没有才访问其函数原型中的。

原型的改变影响所有继承它的实例化对象

function Ninja(){
this.swung = true;
} var ninjaA = new Ninja();
var ninjaB = new Ninja(); Ninja.prototype.swingSword = function(){
return this.swung;
}; console.log( ninjaA.swingSword(), "即使在定义之后,方法仍然存在" );
console.log( ninjaB.swingSword(), "同样的情况" );

正如先前所说,实例化对象本身没有的属性,它就去函数的原型里寻找。如果原型修改,它寻找的结果也不一样。

问题:构建可以链式调用的方法

function Ninja(){
this.swung = true;
} var ninjaA = new Ninja();
var ninjaB = new Ninja(); //在原型里增加一个方法,返回调用者,并修改swung的值 console.log( ninjaA.swing().swung );
console.log( ninjaB.swing().swung );

通过返回this实现

function Ninja(){
this.swung = true;
} var ninjaA = new Ninja(); Ninja.prototype.swing= function(){
this.swung = false;
return this;
}
console.log( ninjaA.swing().swung );

this指向调用它的对象,在方法中返回this,函数执行完毕时,仍然是调用它的对象。

javascript高级知识点——函数原型的更多相关文章

  1. javascript高级知识点——函数的长度

    代码信息来自于http://ejohn.org/apps/learn/. 函数的长度属性如何工作? function makeNinja(name){} function makeSamurai(na ...

  2. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  3. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  4. JavaScript高级程序设计--函数小记

    执行环境和作用域链   每个函数都有自己的执行环境.当执行流进入一个函数时,函数 的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境.   当代码在一个环境中 ...

  5. JavaScript高级特性之原型

    JavaScript的原型 原型prototype属性仅仅适用于函数对象(这里的函数对象是自己为了理解更好定义的,普通对象是没有原型属性的) 1.研究函数原型: <script type=&qu ...

  6. Javascript高级程序设计——函数声明与函数表达式的区别

    在Javascript中,函数是Functioin类型的实例,所以函数也具备属性和方法,因为函数是对象,所以函数名自然就是指向对象的指针啦. 函数可以通过声明语法和表达式来定义: 声明:functio ...

  7. javascript高级知识点——闭包

    代码信息来自于http://ejohn.org/apps/learn/. 先给出一个权威的定义,函数对象可以通过作用域相互关联起来,函数体内的变量可以保存在函数的作用域内,这种特性称为闭包. 在闭包内 ...

  8. javascript高级知识点——内置对象原型

    代码信息来自于http://ejohn.org/apps/learn/. 可以修改内置对象的方法. if (!Array.prototype.forEach) { Array.prototype.fo ...

  9. JavaScript高级内容:原型链、继承、执行上下文、作用域链、闭包

    了解这些问题,我先一步步来看,先从基础说起,然后引出这些概念. 本文只用实例验证结果,并做简要说明,给大家增加些印象,因为单独一项拿出来都需要大篇幅讲解. 1.值类型 & 引用类型 funct ...

随机推荐

  1. hdu 4686 Arc of Dream_矩阵快速幂

    题意:略 构造出矩阵就行了 |   AX   0    AXBY   AXBY       0  |                                                   ...

  2. js事件的相关收集

    1.阻止事件冒泡: IE:cancelBubble = true; 其他: stopPropagation(); 2.阻止事件的默认行为: IE: returnValue = false; 其他: p ...

  3. JQ对JSON的增删改

    var userlist={ }, } } //方法一 userlist.row1.sex="女";//添加 userlist.row3={name:};//添加 userlist ...

  4. CRC循环校验码

    为了防止数据在传输的时候丢失或被篡改,有了各种校验码. 每种CRC校验都有自己的多项式.每个多项式都有唯一对应的二进制. CRC16就如果名字一样,校验码就是16位的 如果CRC32就是32位的. 原 ...

  5. oracle表导入导出

    数据导出: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中   exp system/manager@TEST file=d:\daochu. ...

  6. python学习笔记:python对象

    一.python对象 python使用对象模型来存储数据,构造任何类型的值都是一个对象.所有的python对象都拥有三个特性:身份.类型和值. 身份:每个对象都有一个唯一的身份标识自己,对象的身份可以 ...

  7. 关于google CDN 在中国访问不了的解决办法

    因原网站的script部分使用了google CDN,导致在中国看不了跟google相关的所有东西 解决方法: 得把google CDN 连接改成其他公司的CDN 例: 修改前:<script ...

  8. IE9下Ajax缓存问题

    使用jQuery的getJSON从后台定时获取数据并刷新界面,使用以下方法时,在Chrome,Firefox下没问题,但在IE9下却无法刷新数据 $.getJSON(webApp + "/G ...

  9. Android 关于操作UI线程

    在非UI线程里访问 Android UI toolkit—这个在一个worker线程修改了 View .这会导致不可预期的结果,而且还难以调试. 为了修复这个问题,Android提供了几个方法从非UI ...

  10. Android 监听网络变化

    Android 监听网络变化