2022男生学什么好
全网推广(营销型网站建设与快速建站、网站优化与推广、软文营销与...
品牌
全栈软件测试
金蛛微信营销 带你实战营销圈 90天实战从零基础到专业大咖
学电脑 计算机培训 就到北大青鸟东莞金码学校 0基础学习 技能提...
2022学什么技术好
电商公开着陆页
构造函数、实例和原型的概念和关系
每个函数都属于对象,都会有一个属性叫prototype。这个属性指向一个对象,我们把他叫做当前函数的原型对象。原型对象下面有个属性叫constructor.这个属性指向当前函数。函数又分为普通函数和构造函数。这里我们说一下构造函数:
定义一个函数 :
function Person(x, y ) {
this.age = x;
this.name = y;
}
var xiaoming= new Person(12, "xiaoming" );
这里创建实例对象 xiaoming的时候就是调用了Person构造函数,使xiaoming有了自己的属性和方法,之后xiaoming和Person也就没有什么直接交集了(可以理解为小明分手了,哎程序员好难╥..╥)
但是每个实例对象都会有一个隐藏属性[[prototype]],这个属性在chrome/firefox下叫__proto__,仅仅供学习调试用.它指向的就是构造函数的原型对象。
原型对象的深入理解
对于这个原型对象,我们就要重点理解下了。这个对象的作用就是为了让所有的实例对象都能共享这个对象的属性和方法(当然实例本身的属性和方法优先级是高于原型的)。每个构造函数都会有一个默认的原型对象。我们只要在改原型对象上做文章就可以实现很多功能。
● 共享属性和方法:
Person.prototype.eyes = 2;
Person.prototype.walk = function ( ){……};
var xiaoming= new Person(12, "xiaoming" );
var xiaohong= new Person(12, "xiaohong" );
xiaoming.eyes
xiaohong.eyes
// 小明和小红都有2只眼
xiaoming.walk
xiaohong.walk
//小明和小红都会走路
● 原型链:
我们先做一个假设,假如我们把一个函数对象Man的原型直接给换成另一个函数对象Person的实例对象xiaoming会怎么样呢?
前面说了,通过实例对象是可以找到函数对象Person的原型。那我们现在Man对象的实例xiaoming是不是也就可以访问到Person对象的原型对象了呢。
function Man( ) {
this.beard = "xxx";
}
Man.prototype = new Person( 23, "xiaoming" );
这里我们相当于把默认的那个原型给重写了,给参数其实就是给原型添加属性和方法
var xiaoming = new Man();
xiaoming.beard //xxx 这里实例xiaoming自己的属性(小明有胡子)
xiaoming.age //23
xiaoming.name //xiaoming 这两个属性是实例的原型上面的属性(其实这个属性是Person实例的属性,但是现在的原型不就是Person实例吗)
xiaoming.eyes //2 这个属性呢,是Person的原型对象上面的了
这里我们基本上都可以访问到,是不是有点继承的味道了。
如果我们再这样搞一个对象,也这么干,这里是不是就感觉像条链一样。最顶端的对象是Object,也就是说到最后了。我们把这条链接方式叫做原型链。这也是继承的依据。
继承
和传统的OOP语言来说,JavaScript语言比较蛋疼的是它没有类这个机制。所以说我们事先js的继承就从对象角度下手了。我们重点说一下依据原型链继承的。(其他的继承我就不说了,比如借用父对象的构造函数等,实用性不强)
1.上面所说的实现原型链的方法虽然有点继承的味道了,但是你有没有发现 实例化xiaoming这个对象的时候调用了Man这个构造函数,但是xiaoming自己的age和name都没能进行构造,只不过是原型上的属性而已(其实是Person自己构造的,new Person( 23, "xiaoming" ))。我们其实可以这样用call和apply这个object原型下面给我们定义好的方法改进下(call和apply方法自己看api说明吧)
function Man(x, y) {
Person.call(this, x, y); //这里你可以这样理解,this指的是Man,这样其实就是借用Person构造函数
this.beard = "xxx";
}
我们把Man的构造函数这样一改,实例化的时候传参,这样age和name这两个属性就是Man自己构造出来的了,并不会被共享
Man.prototype = new Person( );
Man.prototype.constructor = Man;
var xiaoming = new Man(23, "xiaoming");
这里只是让Man的原型的构造函数变成原有的构造函数,如果不加这一句的话,那么Man原型的构造函数就变成undefied,因为实例和构造函数并没有直接关系。这样一来,原型找不到构造函数,这是非常蛋疼的事情,违反了原型链的定义啊。
这边可能会有人问了,我为什么不自己像胡子beard 那个属性一样直接构造呢。
大哥,我这是举例子,你以为实际的项目中就会有这么两个属性吗。而且这样不正是继承的目的吗
可以少写很多代码啊。(说多了都是泪)
但是也是有缺点的:两次调用父类构造函数(第一次是在创建子类原型的时候,第二次是在子类构造函数内部);子类继承父类的属性,一组在子类实例上,一组在子类原型上(在子类原型上创建不必要的多余的属性,实例上的屏蔽原型上的同名属性,是不是感觉有点多余了 ,效率低。
2.为了改进这种方法,下面说的这种继承方式是借助我们伟大的道爷(这个人很厉害,自行百度)的灵感 。这种就是利用一个空函数对象来做一个桥梁.
具体实现方式如下:
function inherits(Child, Parent) {
var F = function () {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
另外在子对象的构造函数中别忘了借用父对象的构造函数哦。(就是那个call或者apply方法)
这里和上面的区别是,子对象的原型现在不是父对象的实例了,变成了空函数对象的实例(父对象不用再创建两次了,并且子对象的原型上也不会有啥属性和方法了)。而空函数对象的原型变成了父对象的原型。前面我们说过,有了实例就能找到原型。所以现在子对象原型和父对象原型是就建立关系了。这种方式现在是最稳的方法,也已经被很多框架给写到源码里面了。
这里我们就用google closure 关于继承的两个api,这边简单举个例子:
Child = function( ){
goog.base(this);
this.height = 12;
}
goog.inherits(Child, Parent);
这里就实现了我们上述实现的,不过封装起来了而已。
北大青鸟东莞金码学校各班有兵乓球队和篮球队,学员可以根据自己的兴趣爱好选择球队参加训练及比赛,既锻炼了身体,又能增进同学感情,学员们在宽敞
项目实训招募啦~~北大青鸟东莞金码学校合作企业、学术团队举行项目实训招募活动,让学员有机会根据自己的喜好选择项目实训,参与项目的开发。
读电脑学什么有前途?这是一个很多人都会思考的一个问题,无论是正在读书的学生还是已经毕业了的学生,都会为自己以后的前景做打算。那么读电脑学什么有前途呢?又能拿高薪,就业好,每天在舒适的环境下轻松工作呢
北大青鸟东莞金码学校是北大青鸟广东省全课程授权中心,拥有软件开发工程师、网络工程师、安卓工程师、学士后Java工程师、学士后 NET工程
人们为了改变现状,追求自己的幸福生活,越来越多的人都选择了拼搏。那么在拼搏的路上是否真能实现自己的目标,很关键的一步便在于最初的选择,那你需要有一技之长的技术,那么在这个社会,现在学什么技术工资高,就业不用愁呢?那肯定是 学一门好的电脑专业了,高薪资,好就业,前景广阔,提升空间大。要满足这些条件的技术工作,数IT行业最合了!
对于大学生,特别是初涉职场的大学生而言,这还真不是一件容易的事。这中间可面临不少挑战。那么,在试用期该如何摆正自己的位置和心态,让
求职道路漫长又艰苦,投了无数封简历,也参加过不少面试,可为何总是沦落到无限期的等通知中呢?到底怎样的求职者才是HR所钟意的?前程无忧论
面试时有些错一定不能犯!这一话题日前在前程无忧论坛引起了网友们的热烈讨论。但总有马失前蹄的时候,总会一不留神暴露出破绽。在面试时如
公司新员工自我介绍的方法:该介绍姓名、年龄、籍贯,主要经历。尽量简练、明了,不能罗嗦。态度要诚恳,最后说:希望大家多关照。公司新员
要毕业找工作了,如何备战算法。尽管在微博上简单梳理过,如下图所示:但因字数限制,特撰此文着重阐述下:程序员如何快速准备面试中的算法
直接上代码:[java] package com example test; import java io File; import java io FileNotFoundException; import java io Fil
许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级搜索-替换
面试Javascript工程师难吗?Javascript工程师的水平参差不齐,如何评定他们技术水平的高低?如何确定Javascript工程师适合承担哪方面的任务?...
渠道作为联系客户和制造商的利益通路之一,既可为制造商提供利益,也为客户提供包括服务在内的产品。那么渠道管理的定义又是什么呢?简言之
依赖注入是Spring Ioc实现Bean对象之间关联关系维护的方式,容器实现了两种对象注入。一种是通过构造方法完成对象的注入,另一种是通过setter方法来完成对象的注入。
9月8日,东莞亿用网络软件有限公司谢总带领公司项目经理抵达东莞北大青鸟金码中心,现场招聘软件开发工程师,在金码就业部老师的安排下,多
很多人认为目前的网络工程师、系统工程师在IT技术业内都不再是高端的技术型人才,从事了这个职位即将面临工作难找,薪金待遇较低的尴尬境
2015年7月31日上午,受东莞理文集团电脑部周副经理的邀请,东莞北大青鸟金码学员服务部田老师带领Y2T102班六位毕业生前往理文集团面试。理
初中毕业走不通传统学历教育道路的人要怎么办?初中毕业上什么技校好?在当代中国,学历虽然重要,但是不是最重要的,学历是进入高级职场的一块敲门砖,但是一身扎实的技术才是自己的核心竞争优势。面对初中毕业上什么技校好这个问题,北大青鸟东莞金码学校潘校长表示:“当今社会,技术人才最贵!现在的企业需要的是真正会做事的能做事的高素质技术型人才,
构造函数、实例和原型的概念和关系每个函数都属于对象,都会有一个属性叫prototype。这个属性指向一个对象,我们把他叫做当前函数的原型对
构造函数、实例和原型的概念和关系每个函数都属于对象,都会有一个属性叫prototype。这个属性指向一个对象,我们把他叫做当前函数的原型对
东莞,是就业、创业的热土,有名的世界工厂,同时也是在发展、转型、升级中的城市,全国各地的年轻朋友怀着梦想来到东莞,在这里打工、生活
很多新手程序员刚踏入编程这个工作岗位时,都会有一种茫然,很多问题不知道如何处理。而具备一定经验的老手编程人员在处理问题上通常都是高
为什么现在大学生找工作那么难,而很多企业又称自己招不到人呢?其实目前,我国人才短缺和大学生就业困难并存,这就意味着现在的大学培养体
对于在东莞寻找工作机会的大学生来说,会发现对于这座有着世界工厂之称的城市,有很多工作机会,但是是普工的。如果不是热门专业,找工作,