27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ... [更多]
E-mail:mzze@163.com
Q Q:32362389
W X:xiaomi168527
27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ... [更多]
E-mail:wf_live@126.com
Q Q:3940019
微博: 王小贱ss
大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ... [更多]
E-mail:97157726@qq.com
Q Q:97157726
用 构造函数 和 原型对象 混合定义方式来定义一个对象方法如下
//1.定义一个构造函数 function Person(n,a){ this.name = n; this.age = a; } //2.通过原型对象设置方法 Person.prototype.say = function(){ console.log('我叫' + this.name + ',我今年' + this.age + '岁'); } //3.实例化构造函数得到 实例对象 var person1 = new Person('张飞', 30); console.log(person1);
1.构造函数的prototype属性 存的是原型对象
console.log(Person.prototype);
2.实例对象的__proto__属性 存的也是原型对象
console.log(person1.__proto__);
他们的值是相等的哦
console.log(person1.__proto__ === Person.prototype);//true
1.通过原型对象的constructor属性,取到构造函数
console.log(Person.prototype.constructor);
2.实例对象也可以直接使用原型对象上的constructor获取构造函数
console.log(person1.constructor);
1.通过构造函数获取实例对象
var person1 = new Person('张飞', 30);
我们注意到,前面例子中每添加一个属性和方法就要敲一遍 构造函数.prototype 。 为减少不必要的输入,更常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象:
//1.定义一个构造函数 function Person(n,a){ this.name = n; this.age = a; } //2.1旧向原型对象上添加一个方法,注意这个方法的用法 Person.prototype.say = function(){ console.log('我叫' + this.name + ',我今年' + this.age + '岁'); } //2.2新直接替换了原来的原型对象 ,用这种方法需要先添加"constructor":Person, 因为产生的问题,原型对象本身的constructor属性丢失了,会取到Object函数 Person.prototype = { "constructor":Person, //需要手动指定构造函数 "say":function(){ console.log('我叫' + this.name + ',我今年' + this.age + '岁'); } }; //实例化构造函数得到 实例对象 var person1 = new Person('张三', 30);
问题:使用2.2这种方法直接替换原来的原型对象,需要在开始添加"constructor":Person, 要不然获取不到构造函数
console.log(person1.constructor); //实例对象获取构造函数 //结果:不写"constructor":Person,得到的是到Object() ,只有写了才会得到构造函数,因为替换后原型对象本身的constructor属性丢失了,
console.log(Person.prototype.constructor); //原型对象获取构造函数 //结果:不写"constructor":Person,得到的是到Object() ,只有写了才会得到构造函数,因为替换后原型对象本身的constructor属性丢失了,
console.log(Person.prototype); //构造函数获取原型对象 console.log(Person.prototype.__proto__); //构造函数获取原型对象的原型对象 console.log(person1.__proto__.__proto__);//实力函数获取原型对象的原型对象 //找到一个对象的原型对象,还可以继续找原型对象的原型对象,直到找到最顶层(Object.prototype)为止
不写"constructor":Person,的控制台输出(不正常)
写了"constructor":Person,的控制台输出(正常)
//定义两个构造函数 function A(){ this.age = 20; } function B(){ // this.age = 30 } //实例化 构造函数A得到一个对象 var obj = new A(); //将A的实例对象,设置为 B的原型对象 B.prototype = obj; //实例化 构造函数B var obj2 = new B(); console.log(obj2); //B console.log(obj2.__proto__);// obj2的原型对象为A console.log(obj2.__proto__.__proto__); //结果为Object() obj2的原型对象的原型对象;A.prototype 相当于是 new Object() console.log(obj2.__proto__.__proto__.__proto__); //结果为Object() obj2的原型对象的原型对象的原型对象;A.prototype 相当于是 new Object() console.log(obj2.age); //结果为20,因为构造函数B的this.age被注释,所以他使用A的age为20 这种原型对象的链式结构,叫做是原型链
查找一个对象的成员,先从自身找,如果没找到,就继续在原型对象的原型对象上找,这种原型对象的链式结构,叫做是原型链
1. 查找一个对象的成员,先从自身找(包括自身构造函数中定义的成员),
2. 如果找到就直接使用。
3. 如果没找到,就继续在原型对象的原型对象上找,
4.直到找到最顶层的原型对象(Object.prototype)
这种根据原型对象的链式结构,进行的链式查找方式,通常也叫做原型链(从查找对象的成员的方式角度)
使用场景:人 都会说话 走路 有的人会打球 有的人会唱歌
多个子类构造函数 继承 同一个父类构造函数
// A 构造函数 function A(){ this.age = 30; } //原型对象 A.prototype.say = function(){ console.log('hello'); } //实例对象 var obj_a = new A(); console.log(obj_a.age); //结果30 obj_a.say(); //hello //obj_a 继承了 原型对象 A.prototype ,能够直接使用原型对象的方法
//让B的实例对象 继承 A的实例对象
//基本语法: B.prototype = new A();
//A是父类构造函数 this.age = 30; } A.prototype.say = function(){ console.log('hello'); } var obj_a = new A(); // B是子类构造函数 function B(){ this.sex = "男"; } B.prototype = obj_a; // B.prototype = new A(); B.prototype.zou = function(){ console.log('走路'); } //实例化子类构造函数B,得到一个子对象 var obj_b = new B(); //B的实例对象,可以使用A实例对象的成员 console.log( obj_b.age ); obj_b.say(); obj_b.zou();
//父类构造函数 function Person(){ } Person.prototype.say = function(){ console.log('所有人都会说话'); } Person.prototype.walk = function(){ console.log('所有人都会走路'); } //子类构造函数 歌手 function Ren(){ } Ren.prototype = new Person(); Ren.prototype.changge = function(){ console.log('唱歌'); } var obj = new Ren(); obj.say(); //所有人都会说话 obj.walk(); //所有人都会走路 obj.changge(); //唱歌 //子类构造函数 球员 function Ball(){ } Ball.prototype = new Person(); Ball.prototype.play = function(){ console.log('打球') } var obj2 = new Ball(); obj2.say(); //所有人都会说话 obj2.walk(); //所有人都会走路 obj2.play(); //打球
本站内容均为小米原创,转载请注明出处: 小米技术社区>> 构造函数、原型对象、实例对象三者之间的关系;原型链概念引入和原型链继承
深圳SEO优化公司盐城网站seo优化哪家好赣州SEO按天收费多少钱铜陵网站优化推广推荐兴安盟网站搭建价格邢台网站制作哪家好宝安关键词按天扣费哪家好永新营销网站哪家好阳泉阿里店铺托管推荐阿坝网站优化排名多少钱山南seo网站优化哪家好菏泽网络推广公司桂林网站建设设计推荐平湖关键词排名包年推广大同关键词排名包年推广公司娄底网络广告推广镇江营销型网站建设哪家好陇南关键词排名包年推广公司湘潭网站开发报价昆明设计公司网站多少钱红河外贸网站设计多少钱石岩seo公司亳州关键词排名公司定西网站推广系统推荐郴州建设网站价格南充网页设计哪家好淮北seo排名多少钱蚌埠网站建设设计哪家好秦皇岛网页设计报价黄石阿里店铺托管多少钱云浮模板推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运