JS 是沒有繼承的,不過可以曲線救國,利用構造函數、原型等方法實現繼承的功能。
var o=new Object();
其實用構造函數實例化一個對象,就是繼承,這裡可以使用Object中的所有屬性與方法。那麼為什麼能訪問Object對象的方法,其實訪問的是其原型對象的方法,所有的方法都是放在原型中而不是類中。
console.log(o.__proto__ === Object.prototype) // true 繼承的本質 console.log(o.__proto__ === Object); console.log(Object.__proto__ === Function.prototype); console.log(Function.prototype.__proto__ === Object.prototype); console.log(Number.__proto__ === Function.prototype);
object是萬物祖先,Everything is object 嘛。
1、內置對象都繼承自object
var myNumber = new Number(10); //實例化一個數字對象
字符串對象,其實是String對象的一個實例化
var s = ‘str';
除了可以訪問自身屬性方法,還能訪問父類屬性方法
console.log(s.toUpperCase()); console.log(s.toString());
2、自定義對象的繼承
// 父類 var Person = function(){ this.name='AV老師'; this.test='測試中的畢福劍'; } Person.prototype={ say:function(){ console.log('呀買碟'); } } // 構造函數 var Canglaoshi = function(name,age,cup){ this.name=name; this.age=age; this.cup=cup; } // 繼承person,則擁有person原型中的方法 Canglaoshi.prototype=new Person(); Canglaoshi.prototype.ppp=function(){ console.log('啪啪啪'); } // 蒼老師擁有了person中的方法 var xiaocang=new Canglaoshi('空空',18,'E'); xiaocang.say(); console.log(xiaocang.name); console.log(xiaocang.age); console.log(xiaocang.cup); console.log(xiaocang.test);
3、自定義對象繼承的原型鏈演示
(function() { //父類 function SuperParent() { this.name = 'mike'; } //子類繼承父親 - 二次繼承: function Parent() { this.age = 12; } Parent.prototype = new SuperParent(); //通過原型,形成鏈條 var parent = new Parent(); console.log("測試父親可以訪問爺爺屬性:" + parent.name); console.log("測試父親可以訪問自己的屬性:" + parent.age); //繼續原型鏈繼承 - 三次繼承 function Child() { //brother構造 this.weight = 60; } Child.prototype = new Parent(); //繼續原型鏈繼承 //原型鏈測試2 //兒子集成爺爺 var child = new Child(); console.log("測試兒子可以訪問爺爺的屬性:" + child.name); //繼承了Parent和Child,彈出mike console.log("測試兒子可以訪問父親的屬性:" + child.age); //彈出12 console.log("測試兒子可以訪問自己獨特的屬性:" + child.weight); //彈出12 //原型鏈測試 //爺爺可以訪問Object中的方法 var test = new SuperParent(); console.log(test.name); console.log(test.toString()); //訪問鏈: SuperParent構造對象--》SuperParent原型對象--》Object對象--》Obect原型對象(找到toString方法)--》null console.log(child.name); //原型鏈:首先訪問Child構造函數,發現沒有name屬性--》尋找__proto__,判斷起指針是否為空--》指向Child原型函數,尋找有沒有name屬性--》 //---》沒有找到,則判斷其__proto__屬性是否為null,如果不為null,繼續搜索--》找到parent對象,檢查是否有name屬性,沒有。。。。 })()
4、構造函數繼承
(function() { function People() { this.race = '人類'; } People.prototype = { eat: function() { alert('吃吃吃'); } } /*人妖對象*/ function Shemale(name, skin) { People.apply(this, arguments); // 用call也是一樣的,注意第二個參數 this.name = name; this.skin = skin; } //實例化 var zhangsan = new Shemale('張三', '黃皮膚') console.log(zhangsan.name); //張三 console.log(zhangsan.skin); //黃皮膚 console.log(zhangsan.race); //人類 })()
5、組合繼承
(function() { function Person(name, age) { this.name = name; this.age = age; } Person.prototype.say = function() {} function Man(name, age, no) { /*會自動調用Person的方法,同時將name age傳遞過去*/ Person.call(this, name, age); //自己的屬性 this.no = no; } Man.prototype = new Person(); var man = new Man("張三", 11, "0001"); console.log(man.name); console.log(man.age); console.log(man.no); })()
6、拷貝繼承
<script> +(function() { var Chinese = { nation: '中國' }; var Doctor = { career: '醫生' }; // 請問怎樣才能讓"醫生"去繼承"中國人",也就是說,我怎樣才能生成一個"中國醫生"的對象? // 這裡要注意,這兩個對象都是普通對象,不是構造函數,無法使用構造函數方法實現"繼承"。 function extend(p) { var c = {}; for (var i in p) { c[i] = p[i]; } c.uber = p; return c; } var Doctor = extend(Chinese); Doctor.career = '醫生'; alert(Doctor.nation); // 中國 })() </script>
7、寄生組合繼承
<script> +(function() { /*繼承的固定函數*/ function inheritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function Person(name) { this.name = name; } Person.prototype.say = function() {} function Student(name, age) { Person.call(this, name); this.age = age; } inheritPrototype(Student, Person); var xiaozhang = new Student('小張', 20); console.log(xiaozhang.name) })() </script>
8、使用第三方框架實現繼承
<script src='simple.js'></script> <!-- 使用的第三方框架simple.js --> <script> +(function() { < script > var Person = Class.extend({ init: function(age, name) { this.age = age; this.name = name; }, ppp: function() { alert("你懂的"); } }); var Man = Person.extend({ init: function(age, name, height) { this._super(age, name); this.height = height; }, ppp: function() { /*調用父類的同名方法*/ this._super(); /*同時又可以調用自己的方法*/ alert("好害羞 -,- "); } }); var xiaozhang = new Man(21, '小張', '121'); xiaozhang.ppp(); })()
希望對大家學習javascript程序設計有所幫助。