讲js继承之前,想一想什么是继承? 生活中有很多例子,比方说继承财产,继承女朋友的前男友的前女友 ヽ(ー_ー)ノ ,这些和js继承差不多,但是有一个不一样的地方,就是继承过后,原先的人就没有了,js继承过后原先还有原先的属性。
最简单的继承 : 原型链继承(我最简单,也重要,也常见,不要因为简单看不起我,我很傲娇的 o(´^`)o)
原型链继承抓住了一个重要核心: 我指向的构造函数的实例就能访问原型的方法(没错,不需要理由谁叫我是你爸爸,我的方法给你用 ( ̄ェ ̄;)
(爸爸更新的技术儿子享受就行了,爸爸添加的方法给儿子用)
function Wife( ){ this.say : function(){ console.log( ' 今天你也很美,比月亮还美 ' ) } } // 生一个儿子呗 var son = new Wife() // 找到老公并且给孩子他爹发明一个方法fn,有了这个方法可以说Hello了 Mon.prototype.fn = function() { cosole.log('Hello') } son.fn() // 'Hello'
(幸福生活没过多久,老公出轨,老婆和老公离婚,老婆不想找另一个男的,厉害了自己造一个,有鼻子有眼的,让他的心一直指向老婆constructor)
function Wife( ){ this.say : function(){ console.log( ' 今天你也很美,比月亮还美 ' ) } } // 生一个儿子呗 var son = new Wife() // 新造一个老公 Mon.prototype = { fn : function(){ console.log('老婆你最美') }, say : '老婆最棒', // 把心永远向着老婆 constructor : Wife } son.fn() // '老婆你最美'
吸功大法:混入式继承 + 原型链继承
function Wife(){ name : ' 仙女 ', age : 20 } Wife.prototype.extend(obj){ for( var key in obj ){ if( obj.hasOwnProperty(key) ){ this[ key ] = obj [ key ] } } } var wugong1 = { 'qiankun': '乾坤大挪移' } var wugong2 = { 'xuanming': '玄冥神掌' } var son = new Wife(); son.extend(wugong1) son.extend(wugong2) console.log(son) // 添加了wugong1,wugong2,this指向发生了改变,指向了son这个实例对象,所以是son添加了,而不是原型添加了wugong1,wugong2
(为什么不说混入继承,混入继承就是遍历一个对象,把对象的属性一个一个赋给另一个对象,有需求的话注意深浅拷贝)
最骚的继承 : 经典继承 var newObj = Object.create( obj ) newObj是obj.contructor的实例,不是构造函数,也就是直接__proto__逆操作,骚的一P