〇 每个函数都拥有prototype属性,而该属性所储存的就是原型对象

1)原型属性——

上面我们测试了foo()函数的

1) length属性(length属性除了可以用在数组中,还可以用于记录函数参数的数量)

2)来自原型的constructor property属性(该属性实际上是一个之指向用于创建该对象的构造器函数的引用),其引用就是Function()这个构造器函数

3)来自原型的prototype属性(每个函数的prototype属性都指向了一个对象,并且它只有在该函数是构造器时才会发挥作用,并且它创建的属性可以当做函数自身属性使用)

 

  • 利用原型属性添加方法和属性
function Gadget(name,color){
  this.name = name ;
  this.color = color;
  this.whatAreYou = function () {
     return 'I am a' + this.color + '' + this.name;
  } ;
}

Gadget.prototype.price = 100;
Gadget.prototype.rating= 3;
Gadget.prototype.getInfo = function () {
    return 'Rating:' + this.rating +',price:' + this.price;
}

/*我们还可以避开这种逐一添加的繁琐*/
Gadget.prototype = {
   price:100,
   rating:...  /*and so on...*/
}
  • 使用原型的方法与属性
/*接下来,我们就可以直接用该构造器来新建对象了*/
var newtoy = new Gadget('赛车','白色');

newtoy.name;                   /*赛车*/

newtoy.color;                  /*白色*/

newtoy.whatAreYou()            /*"I am a 赛车 白色"*/

newtoy.price;                  */

newtoy.rating;                   */

newtoy.getInfo();              /*Rating : 3, price:100*/
  • 自身属性与原型属性

      注意:

           1)自身属性的优先级高于原型属性

          也就是说,当我们使用对象的某个属性,它会先从对象自身查看,如果找到了,就不会在去原型中查看

          2)这时如果我们仍然想得到原型中的该属性,我们可以使用 delete操作符(delete操作符,只会删除对象自身的属性,如:delete newtoy.name;)

3)  我们通过hasOwnprototype()方法来判断一个属性是来自自身属性还是原型属性

newtoy.hasOwnProperty('name');  /*true*/
  • 枚举属性

      

var o = {x:1,y:2,z:3};
console.log('toString' in o);                      //true
console.log(o.propertyIsEnumerable('toString'))    //false
var key;
for (key in o){
    console.log(key);                              //x y z
}

var obj = Object.create(o);            //指向a
obj.a = 4;

console.log('x' in o)                //我们通过Object.create的JavaScript内置函数,把obj指向了对象o,此时o就是obj的原型

/*1)遍历对象和原型链上的属性*/
var key;
for (key in obj){
    console.log(key);                              //a x y z
}

/*2)给for  in 遍历一个条件(如果他是对象身上的属性则遍历:obj.hasOwnProperty(key))
让他只遍历这个对象上的属性,而不再遍历这个对象原型链上的属性。*/
var key;
for (key in obj){
    if (obj.hasOwnProperty(key)){
        console.log(key);                              //a
    }
}

(知识点)JavaScript原型和原型链的更多相关文章

  1. 如何理解JavaScript的原型和原型链

    在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说 ...

  2. 十分钟读懂JavaScript原型和原型链

    原型(prototype)这个词来自拉丁文的词proto,意谓“最初的”,意义是形式或模型.在JavaScript中,原型的探索也有很多有趣的地方,接下来跟随我的脚步去看看吧. 原型对象释义 每一个构 ...

  3. 详解Javascript中的原型与原型链

    目录 知识点 参考资料 结束语 知识点 面向对象编程 我们熟悉的Java和C#里,面向对象的两个基本概念是类class和实例instance,而ES6以前的Javascript并没有设计class. ...

  4. 深入总结Javascript原型及原型链

    本篇文章给大家详细分析了javascript原型及原型链的相关知识点以及用法分享,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 我们创建的每个函数都有一个 prot ...

  5. 全面了解 Javascript Prototype Chain 原型链

    原型链可以说是Javascript的核心特征之一,当然也是难点之一.学过其它面向对象的编程语言后再学习Javascript多少会感到有些迷惑.虽然Javascript也可以说是面向对象的语言,但是其实 ...

  6. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  7. 【javascript基础】4、原型与原型链

    前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...

  8. 【JavaScript】深入理解JavaScript之强大的原型和原型链

    由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...

  9. Javascript 原型和原型链

    先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...

  10. javascript 原型 和 原型链

    最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...

随机推荐

  1. .进程&线程(&java.lang.Thread)详解

    一.进程与线程 进程 我们在进行操作电脑的时候,通常会打开浏览器,通讯工具等应用程序,这个时候CPU通过作业调度在内存中就会分配一些空间让它们处于宏观上的运行状态(处于可以被CPU执行的状态),而这部 ...

  2. Mysql 保留最新的10条数据

    Mysql每天执行计划,保留最新的10条数据,其余的删除 1.Mysql 保留最新的10条数据 sql语句: DELETE tb FROM tbname AS tb,( SELECT id FROM ...

  3. App对接支付宝移动支付功能

    前段时间看了下app对接支付宝移动支付的功能,并自己总结了下支付宝移动支付的实现流程 一.申请流程          前提是已有现成的应用. 1.  申请地址            https://b ...

  4. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  5. jquery实现名单滚动

    转:http://www.qdfuns.com/notes/25341/917d9cb031f835a086dd445b77b6e04e.html 介绍:记录滚动特效.就是那一排文字不停地滚啊滚啊滚得 ...

  6. Java基础--定时任务Timer(转载)

    Java基础--定时任务Timer 一.Timer介绍 java.util.Timer java.util.TimerTask Timer是一个定时器类,通过该类可以为指定的定时任务进行配置.Time ...

  7. JDBC(上)

    1. 课程回顾 mysql加强 1)数据约束(表约束) 默认值: default 默认值 非空:   not null 唯一: unique 主键: primary key (非空+唯一) 自增长: ...

  8. Ubuntu14.04上安装openGL

    安装命令:sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev sudo apt-get install ...

  9. Butter Knife使用详解

    Butter Knife Github地址: https://github.com/JakeWharton/butterknife 官方说明给出的解释是 Bind Android views and ...

  10. Struts2(二)之封装请求正文、数据类型转换、数据验证

    一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...