一 原型:

1 定义:原型是function对像的一个属性,他定义了构造函数制造出的对象的公共祖先;

通过该构造函数产生的对象,可以继承该原型的属性和方法。

原型也是对像。prototype;

Person.prototype.name = 'jams';

function Person(){

}

var person = new Person();

当打印:console.log(person.name)时,会先从函数中找看下有没有这个属性值,如果没有就去原型prototype中找;

因此,这时候打印出来的值为:jams

prototype 是函数对象默认的属性,可以增删改查;

2 利用原型特点和概念,可以提取共有属性;

3对象如何查看原型——>隐式属性:__proto__

__proto__ 中存放的就是构造函数的原型

相当于:在函数中隐藏了一段代码: var  this = {

__proto__: Person.prototype

}

举个例子:

var obj = { name: 'a'}

var obj1 = obj;

obj = {name : 'b'}

console.log(obj1.name);// 输出的值为 a

console.log(obj.name);// 输出的值为 b 
  对比:

var obj = { name: 'a'}

var obj1 = obj;

obj.name ='b'

console.log(obj1.name);// 输出的值为 b

console.log(obj.name);// 输出的值为 b

原因: 当你修改obj.name 时,修改的是原型中的值,当你重新附值给obj时(obj={name:'b'}),相当于重新定义了obj这个变量;

换个理解方式为,obj.name 是一个指针,而obj 是一个变量;

4 对象如何查看对象的构造函数:constructor;

constructor 是默认自带的一个属性,他的值指向原函数;

二 原型链:

1如何构成原型链: 一级一级往上找;

举个栗子:

Grand.prototype.lastName = 'a';

function Grand(){

}

var grand = new Grand();

Father.prototype = grand;

function Father() {

this.name =  ' b ';

}

var father = new Father();

Son.prototype = father;

function Son(){

this.hobbit = 'smoke';

}

var son = new Son();

console.log( son.name );  // b

console.log(son.lastName); // a

2 原型链上属性的增删改查:跟原型上的增删改查基本一致,其中删除:delete 只能通过原型prototype 才能删除原型的值;

Person.prototype = {

name = 'a',

sayName : function(){

console.log(this.name);

}

}

function Person(){

this.name = 'b';

}

var person = new Person();

sayName 里面的this指向是,谁调用的这个方法,this指向谁;

所以最终结果person.sayName() 的值为b

而Person.prototype.sayName() 的值为a

3绝大多数对象的最终都会继承自Object.prototype

但不是所有的对象都可以继承,特例:Object.creat()原型;

例如:object.creat(null) ,该对象没有prototype原型;

4原型链的重写:

例如常见的如下原型链就是经常被重写试用的,当然自己定义的原型同样也是可以被重写

Object.prototype.toString

Number.prototype.toString

Array.prototype.toString

Boolean.prototype.toString

String.prototype.toString

(题外话:JS 有个小bug:

控制台运算:0.14*100,去看下运算结果: 14.000000000000002  这是js精度不准问题导致的;

解决方法:小数先乘以100然后向下取整或向上取整。如果利用保留两位有效数字的方法toFixed()再乘以100是不准确的;

math.random() 会产生一个(0,1)的随机数

toFixed() 保留两位有效数字

Math.tofloor() 向下取整

Math.toceil() 向上取整;

var num =Math.tofloor(Math.random()*1000);  // 获取0-100的随机数;

)

三 call、apply

call、apply的作用:可以借助别人的函数实现自己的功能

call 可以该表this指向

例如:

function Person(name,age){

//this == obj;

this.name = name;

this.age = age;

}

var person = new Person( 'a' ,100);

var obj = {}

Person.call(obj, 'b' ,300);

这句话的意思就是调用Person的方法,然后将相关值附值给obj,使得obj有相关参数属性值;

执行结果:obj

{name: "b", age: 300}

这样的好处,借用Person的方法来封装了obj;

例如:

function Person(name,age,sex){

this.name  =  name;

this.age = age;

this.sex = sex;

}

function otherInformation(tel,grade){

this.tel = tel;

this.grade = grade;

}

function Student(name,age,sex,tel,grade) {

Person.call(this,name,age,sex);

otherInformation.call(this,tel,grade)

}

var student = new Student('asd',123,'male',129,2018) ;

输出结果:

Student {name: "asd", age: 123, sex: "male", tel: 129, grade: 2018}

call与apply的区别:后面传的参数形式(或者传参列表)不同;

apply 只能传两个参数,一个是this,另一个是数组,例如: Person.apply(this,[name,age,sex]);

转载请注明出处

转载于:https://www.cnblogs.com/Anderson-An/p/9942805.html

原型以及原型链的学习随笔相关推荐

  1. 在图书馆学习红宝书的一天(二)· 慢慢看原型、原型链就看懂了~

    前言 大家好,这里是@IT·平头哥联盟,我是团宠闪光少女--粉刷酱. 要怎么描述编程是个多幸福的工作呢? 我们很多人都想着如果能一辈子编程,那真是太好了. 而现实生活中,对未来的担忧和焦虑常常困扰着我 ...

  2. 小汤学编程之JavaScript学习day04——自定义对象、原型与原型链、BOM

    一.自定义对象 1.对象的定义     2.对象的使用 二.原型与原型链 1.JS的继承结构图     2.关键点 三.BOM 1.window对象     2.document对象     3.lo ...

  3. 深入学习js之——原型和原型链

    开篇: 在Brendan Eich大神为JavaScript设计面向对象系统的时候,借鉴了Self 和Smalltalk这两门 基于原型的语言,之所以选择基于原型的面向对象系统,并不是因为时间匆忙,它 ...

  4. JavaScript学习(五十九)—原型、原型链、闭包以及闭包的不足

    JavaScript学习(五十九)-原型.原型链.闭包以及闭包的不足 一.什么是闭包? 所谓闭包就是指被定义在其他函数内部的函数. 闭包函数可以访问它所在的函数的所有变量. 文字太抽象了,画图解释一下 ...

  5. Object常用方法、原型链、面向对象随笔

    面向对象 Object对象常用方法 原型和原型链 es6构造函数 es6静态属性和方法 Object对象常用方法 Object.assign() 1个值拷贝,两个值改变第一项合并,三个值以上改变第一项 ...

  6. 浅谈JS原型与原型链(一)

    最近学习JavaScript原型与原型链的时候,被这块知识烧得脑壳疼,prototype与__proto__混淆不清.网上各种图解,都画的好复杂,绕老绕去,不明所以,看得越来越糊涂.还是亲自动手敲敲, ...

  7. js原型和原型链_重学js --原型与原型链

    一.什么是原型: .每个对象都有一个__proto__属性,并且指向它的prototype原型对象 每个构造函数都有一个prototype原型对象 prototype原型对象里的constructor ...

  8. javascript——原型与原型链

    一.prototype 在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象. 例如: function Person(age) {this.age = age ...

  9. 深入理解JavaScript系列(5):强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...

最新文章

  1. 本科4篇顶会!清华特奖高天宇干货分享:我是这样写论文、做实验、与导师相处...
  2. 一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
  3. jmeter学习指南之深入分析跨域传递cookie
  4. Ext.grid.Panel表格分页
  5. Github标星86.4K+:常见数据结构与算法的Python实现
  6. python中socket实现代理功能_python实现代理服务功能实例
  7. android viewpager 滑动方法,Android中Viewpager禁止滑动的实现
  8. pytorch的torch.cuda.is_available()输出false
  9. c语言次幂如何表达_如何确保分布式场景下的并发幂等性?
  10. 二叉树的递归与非递归
  11. ERP进销存源码(进销存ERP系统)
  12. 数据分析的步骤和常用方法
  13. 杭州市直职称计算机考点地址,杭州中级会计考试地点在哪里
  14. 计算机的安全保障机制,技术安全保障管理制度
  15. 设计符合人需求层次模型的商业模式——揭密冰桶挑战背后,不为人知的商业秘密!
  16. Google Earth Engine(GEE)——ASTER全球水体数据库(ASTWBD)第1版
  17. 中国虚拟邮箱软件行业市场供需与战略研究报告
  18. 最新干货get,手机相机项目的整体测试流程是怎样的?
  19. Oracle11g使用dbms_parallel_execute对大表进行并行update
  20. ArcGIS出图时如何制作花式边框

热门文章

  1. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
  2. python有什么证可以考1002python有什么证可以考_离python二级考还有十几天,吓的我赶紧买了本python教程...
  3. linux配置路径,Linux下配置搜索路径
  4. php 有request,请问,php中的$_REQUEST是什么意思啊?
  5. mongodb从3.2升级到4.4_人教版六年级下册数学微课视频及练习4.4.2 比例尺的应用...
  6. 什么作用计算机辅助工艺,什么是CAPP技术(计算机辅助工艺过程设计)
  7. matlab对有周期性噪声的图像去噪,数字图像中去除周期性噪声研究.doc
  8. java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法
  9. 什么是python构造方法_什么是Python?
  10. portlet_Portlet生命周期