刚开始接触对象原型时大脑就开始起义了,脑子就转不灵清了。就感觉怎么着这个概念就是灌输不进去,俗称断路。后面找了很多资料,最主要的还是要借助于《JavaScript语言精髓》这本书,让我对这此豁然开朗,希望说的不对的地方请给予指正,谢谢。

一、什么是原型?

  原型包含一个对象("prototype"对象),是构造函数特有的属性。将所有实例对象共享的属性和方法放在里面,不需要共享的属性和方法则放在构造函数里面。它能继承私有和共享属性和方法。

二、prototype实例

  首先创建一个构造函数,具有name属性。

        function Person(name){
this.name = name;
}

  构造函数创建好之后,我想创建两个实例,并且输出他们的name值。

        var p1 = new Person("张三");
var p2 = new Person("李四");
console.log(p1.name+","+p2.name); /* 输出张三,李四*/

  那现在我想给p1张三在添加一个eat属性,我要他可以吃饭(food),那既然你张三都可以吃饭,那我李四要要吃饭,那我也输出p2.eat,但是结果是undefined……如下所示。

        p1.eat = "food";
console.log(p1.eat); /* 输出food */
console.log(p2.eat); /* 输出undefined */

  原来是张三自己偷偷摸摸的去吃饭,没让李四知道,哎╮(╯▽╰)╭。那既然这样,Person就不得不添加一个共用属性eat了,得让大家一起吃饭呀。

        Person.prototype.eat = "food";
console.log(p1.eat); /* 输出food */
console.log(p2.eat); /* 输出food,我也可以吃饭了…… */

  添加Person.prototype.eat = "food"这个以后,eat属性就被添加到原型库中,eat属性就可以共享了(李四说“太好了,我也可以吃饭了o(≧v≦)o~~”)。这个属性和方法(方法类似处理)的问题就解决了,那如果出现两个对象Person和Student,Person还是具有构造函数的name属性和用prototype添加的eat属性,我想让Student继承Person中所有的属性和方法,请看第三点。

三、prototype继承实例

  首先创建Person和Student构造函数(为了方便看,构造函数和实例输出一起写了)。

        function Person(name){
this.name = name;
}
Person.prototype.eat = "food";
function Student(name,eat){
Person.apply(this,arguments); /* 继承构造函数,即私有属性 */
}
var s1 = new Student("王五","food");
console.log(s1.name); /* 输出 王五 */
console.log(s1.eat); /* undefined */

  Student要继承Person中的属性,添加Person.apply(this,arguments) (标注:apply中this表示实例化的对象s1,arguments是new Student()中的参数,这是系统执行的),表示Student继承Person中属性。创建一个实例s1,s1输出正常,为什么s1.eat输出undefined?Person中不是已经添加了eat属性吗?为什么还不行呢?我找啊找,最终发现原来是Person.apply(this,arguments)只能继承构造函数中的属性,哎,真是弱爆了。那我想要继承原型中的属性怎么办?那容易,请看下面代码。

        Student.prototype = new Person(); /* 继承原型,即共享属性 */
var s1 = new Student("王五","food");
console.log(s1.name); /* 输出 王五 */
console.log(s1.eat); /* 输出 food */

  添加一个Student.prototype = new Person()就可以了。

  这里做一个特别解释:

  Student具有prototype这个属性的原因是因为它是一个function一个构造函数,前面我提到过,这个是构造函数特有的属性。如果student是这样的。

var student = {
name: "张三"
}

  那就要报错了,说student不是一个function。这个是大家特别注意的。

  还有为什么要new Person()呢,这个和java中类似,但是在javascript中只针对于构造函数(构造函数中函数命名和类命名类似,首字母要大写),其他不需要new。

  有哪里讲解的不好或者是不正确的地方,希望大家能第一时间反馈给我,希望和大家共同进步,谢谢。

  

  

对原型prototype的详解的更多相关文章

  1. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  2. 最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)

    最详尽的 JS 原型与原型链终极详解,没有「可能是」.(一) 第二篇已更新,点击进入第三篇已更新,点击进入

  3. JS原型与原型链终极详解(转)

    JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...

  4. ProtoType原型和__Proto__原型链的详解

    var arr = new Array(12,13,14,15,16,17,18); var arr2 = new Array(12,13); arr.sun=function(){ //用原型加Ar ...

  5. js重点--原型链继承详解

    上篇说过了关于原型链继承的问题,这篇详解一下. 1. function animals(){ this.type = "animals"; } animals.prototype. ...

  6. 【repost】JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  7. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  8. JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  9. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

随机推荐

  1. nhibernate入门使用经验

    最近项目中用到nhibernate,学到了一点.就在这里写一点. nhibernate是java世界的hibernate的.net版本,其工作原理和hibernate一样的.我们需要用hbm的文件来描 ...

  2. sql server快速删除整个数据库表和存储过程

    情况:在远程数据库删除表执行太慢,表过多,数据库无权删除 结果:保留空数据库 方法:利用sql语句,查询网络文摘解决. 说明: 有些有约束,不能直接delete,需要先删除所有约束,语句: DECLA ...

  3. [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...

  4. [Json.net]快速入门

    引言 有个朋友问了一个如何更方便的解析json格式字符串,之前也没怎么研究过json.net,就上网帮他查了一下,现学现卖的给他整了一个demo,这才发现json.net的强大,用着很方便. Json ...

  5. 第五章:Javascript语句

    在javascript中,表达式是短语,那么语句(statement)就是整句或命令.正如英文语句以句号结尾,javascript以分号结尾. 表达式计算出一个值,但语句使某件事发生. “使某件事发生 ...

  6. Git代码管理心得

    一.概述: 这次按照要求进行了看似复杂,实则非常复杂并且麻烦(网上教程众多且啰嗦)的对git使用的学习,从星期六晚18:48我准备这次作业开始,直到了晚上22:44才结束电脑上的操作···(导致这篇随 ...

  7. HTML DOM 基础

    $. HTML DOM 定义了访问和操作 HTML 文档的标准方法.  DOM 是 W3C(万维网联盟)的标准. $. DOM树. $. W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它 ...

  8. Struts2 数据校验流程

  9. new-nav-css

    header:before, header:after ,.navigation:before, .navigation:after,.nav-row:before, .nav-row:after,. ...

  10. 【kAri OJ605】陈队的树

    时间限制 1000 ms 内存限制 65536 KB 题目描述 陈队有N棵树,有一天他突然想修剪一下这N棵树,他有M个修剪器,对于每个修剪器给出一个高度h,表示这个修剪器可以把某一棵高度超过h的树修剪 ...