JavaScript是一種面向?qū)ο蟮恼Z言,但
并不是一個(gè)嚴(yán)格的面向?qū)ο蟮恼Z言,因?yàn)閖s是弱類型語言.不像C++,C#這類型語言!他不支持函數(shù)方法重載.你之前寫一個(gè)方法.后面再寫一個(gè)相同名字的方法他默認(rèn)會把上一個(gè)方法覆蓋掉!這種情況和PHP中相同!
1.它擁有對象税灌,可以包含數(shù)據(jù)和處理數(shù)據(jù)的方法扮饶。對象可以包含其它對象。他沒有類(在javascript2.0真正實(shí)現(xiàn)之前)框全,但它卻有構(gòu)造器可以做類能做的事旨袒,包括扮演變量和方法的容器和角色汁针。他沒有基于類的繼承,但它有基于原型的繼承砚尽。兩個(gè)建立對象系統(tǒng)的方法是通過繼承和通過聚合施无。javaScript兩個(gè)都有。
2.一些評價(jià)說javascript不是真正面向?qū)ο蟮囊驗(yàn)樗荒芴峁┬畔⒌碾[藏尉辑。也就是帆精,對象不能有私有變量和私有方法:所有的成員都是公共的。但隨后有人證明了javaScript對象可以擁有私有變量和私有方法隧魄。另外還有批評說javascript不能提供繼承卓练,但隨后有人證明了javascript不僅能支持傳統(tǒng)的繼承還能應(yīng)用其他的代碼復(fù)用模式。
3.說javascript是一種基于對象的語言购啄,是一種正確而略顯保守的判斷襟企,而說javascript不面向?qū)ο螅谖铱磥韯t是錯(cuò)誤的認(rèn)知狮含,事實(shí)上有充足的理由證明javaScript是一種面向?qū)ο蟮恼Z言顽悼,只是與傳統(tǒng)的基于類的面向?qū)ο笙啾龋琷avaScript有它與眾不同的地方几迄,這種獨(dú)特性我們稱它為基于原型的面向?qū)ο蟆?/p>
面向?qū)ο笳Z言思想中有兩個(gè)重要的概念
1.類:有相同的特征和行為的事物的抽象
2.對象:類的一個(gè)實(shí)例
在JS中,判斷一個(gè)變量是否是一個(gè)對象的方法
1.typeof方法
例子:
console.log(typeof 12); //number
console.log(typeof 'abc');//string
console.log(typeof true); //boolean
var fn = function() {};
console.log(typeof fn); //function
var arr = [1,2,'qwer']
console.log(typeof arr) //object(引用類型)
2.instanceof方法 檢測某個(gè)對象是不是另一個(gè)對象的實(shí)例蔚龙。
console.log(true instanceof Object);//false
console.log(arr instanceof Object);//true
var fn = function() {};
console.log(fn instanceof Object);//true
//例如:'qwer',123 直接寫是基本類型,不是引用類型,轉(zhuǎn)化一下
var str = new String('qwer');
console.log(str instanceof String);//true
怎么樣自己創(chuàng)建一個(gè)對象
1.直接創(chuàng)建
結(jié)構(gòu):
var 變量名 = {
屬性名1 : 值,
屬性名2 : 值,
函數(shù)名 : function(參數(shù)){ 函數(shù)內(nèi)容... }
}
例子:
var stu = {
name : '張三',
age : 24,
sex : '男',
sayHi : function(){console.log(this.name);}
}
2.對象的構(gòu)造函數(shù)
為了解決第一種形式,如果要批量創(chuàng)建對象,會非常繁瑣
結(jié)構(gòu):
function 結(jié)構(gòu)函數(shù)名(參數(shù)1,參數(shù)2){
this.屬性名1 = 參數(shù)1;
this.屬性名2 = 參數(shù)2;
this.函數(shù)名1 = function(){函數(shù)內(nèi)容...};
}
例子:
//構(gòu)造函數(shù)
function Student(name,age){
this.name = name;
this.age = age;
this.sayHi = function(){console.log('我叫' + this.name)};
}
//使用構(gòu)造函數(shù)創(chuàng)建對象
var stu1 = new Student('張三',24);
//對象調(diào)用自己的函數(shù)
stu1.sayHi();
3.改造的穩(wěn)妥的構(gòu)造函數(shù)
//改造的穩(wěn)妥的構(gòu)造函數(shù)
function Person(name,age){
var obj = new Object();
//名義上的私有屬性
var n = name;
//設(shè)置值
obj.setName = function(nameNew){
n = nameNew;
};
//獲取值
obj.getName = function(){
return n;
};
return obj;
}
var person = Person('張三',24);
原型(prototype)
每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型屬性
1.原型的基本用法
Student.prototype.school = '清華';
2.原型鏈
當(dāng)要獲取對象的某個(gè)屬性的值的時(shí)候
1.判斷當(dāng)前這個(gè)對象時(shí)候存在這個(gè)屬性,如果有,就輸出
2.如果第一步?jīng)]有獲取到,就去構(gòu)造函數(shù)的原型中找
3.去Object構(gòu)造函數(shù)的原型中找
4.如果都沒有找到,就輸出undefined