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程序設計有所幫助。